Leetcode 56. Merge Intervals 笔记

201 阅读1分钟

Medium

思路

  • 区间进行排序, 以interval开始位置升序排列
  • 循环整个interval的集合去查看有无交集,处理交集
  • 合并交集:起点为前一个区间的起点,终点要比较两个区间较大的那个终点
  • 因为不知道最后有多少个区间,所以先把结果放到arraylist里。最后再转为array

过程

  • sort array 升序
Arrays.sort(intervals, (int[]a, int[]b) -> {
	return a[0] - b[0];
});
  • 用排序之后的集合里的第一个区间作为前置区间,去和其他区间比较
  • 开始for循环,从i=1 开始, 当前interval为cur, 如果cur与prev有重合,将prev合并到cur中;如果没有重合,将prev加到结果中
  • 每次循环后, 更新prev, prev = cur;
  • for循环结束后,把最后一个prev加入到结果中
  • 新建二维数组res,for循环将list中每个元素加进来

代码

class Solution {
    public int[][] merge(int[][] intervals) {
        if(intervals == null || intervals.length == 0) return new int[0][0];
        
        List<int[]> list = new ArrayList<>();
        Arrays.sort(intervals, (int[] a, int[] b) -> {
            return a[0] - b[0];
        });
        
        int[] pre = intervals[0];
        for(int i = 1; i < intervals.length; i++){
            int[] cur = intervals[i];
            if(pre[1] >= cur[0]){
                cur[0] = pre[0];
                cur[1] = Math.max(pre[1], cur[1]);
            }else{
                list.add(pre);
            }
            pre = cur;
        }
        list.add(pre);
        
        int[][] res = new int[list.size()][2];
        for(int i= 0; i < list.size(); i++){
            res[i] = list.get(i);
        }
        return res;
    }
}