← Arrays

Merge Intervals

Medium
Python
def merge(intervals):
    intervals.sort(key=lambda x:x[0])
    res=[intervals[0]]
    for s,e in intervals[1:]:
        if s<=res[-1][1]: res[-1][1]=max(res[-1][1],e)
        else: res.append([s,e])
    return res
Java
public int[][] merge(int[][] iv){
    Arrays.sort(iv,(a,b)->a[0]-b[0]);
    List<int[]> res=new ArrayList<>(); res.add(iv[0]);
    for(int i=1;i<iv.length;i++){
        int[] last=res.get(res.size()-1);
        if(iv[i][0]<=last[1]) last[1]=Math.max(last[1],iv[i][1]);
        else res.add(iv[i]);
    } return res.toArray(new int[0][]);
}

Key Insight

res[-1] negative index vs get(size-1).

Python → Java Differences

  • Python lambda vs Java comparator
  • res[-1] vs get(size-1)
  • Java needs toArray()
Python
def merge(intervals):
    intervals.sort(key=lambda x:x[0])
    res=[intervals[0]]
    for s,e in intervals[1:]:
        if s<=res[-1][1]: res[-1][1]=max(res[-1][1],e)
        else: res.append([s,e])
    return res
Java
public int[][] merge(int[][] iv){
    Arrays.sort(iv,(a,b)->a[0]-b[0]);
    List<int[]> res=new ArrayList<>(); res.add(iv[0]);
    for(int i=1;i<iv.length;i++){
        int[] last=res.get(res.size()-1);
        if(iv[i][0]<=last[1]) last[1]=Math.max(last[1],iv[i][1]);
        else res.add(iv[i]);
    } return res.toArray(new int[0][]);
}

Algorithm Steps

1. Sort by start
2. Merge overlapping