leetcode56.合并区间。(两种问法)

首先是leetcode原题题目:

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠,将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]

输出: [[1,5]]

解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

 

实现代码:

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> res = new  ArrayList<>();
        if(intervals == null || intervals.length ==0){
            return new int[0][];
        }
        Arrays.sort(intervals,(a,b)->a[0]-b[0]);
        int i = 0;
        while(i<intervals.length){
            int start = intervals[i][0];
            int end = intervals[i][1];
            while(i<intervals.length-1 && end >= intervals[i+1][0]){
                i++;
                end = Math.max(end,intervals[i][1]);
            }
            res.add(new int[]{start,end});
            i++;
        }
        return res.toArray(new int[0][]);
    }
}

需要注意的一点是,如果当前区间末位值>下一区间首位置时,需要判断当前区间末位置和下一区间末位置谁大,谁大用谁来当合并后区间的末位置。

Array.sort()方法是用lambda表达式写的,因为comparator接口是一个函数式接口,直接在lambda中使用比较器就可以了。

最后注意的是,整个方法的返回值是一个整型二维数组,而List集合的类型是一个一维数组,coding时容易弄错。

下面是我在牛客网上遇到的同样类型的题目,只不过是以插入一个新区间的形式给出,所以有一些需要注意的点。

给定一组不重叠的时间区间,在时间区间中插入一个新的时间区间(如果有重叠的话就合并区间)。
这些时间区间初始是根据它们的开始时间排序的。
示例1:
给定时间区间[1,3],[6,9],在这两个时间区间中插入时间区间[2,5],并将它与原有的时间区间合并,变成[1,5],[6,9].
示例2:
给定时间区间[1,2],[3,5],[6,7],[8,10],[12,16],在这些时间区间中插入时间区间[4,9],并将它与原有的时间区间合并,变成[1,2],[3,10],[12,16].
这是因为时间区间[4,9]覆盖了时间区间[3,5],[6,7],[8,10].
该题中给出了“有序”的条件,但是是以插入新区间的形式,所以需要注意:
1.插入时不需要进行数组的边界判断,数组中没有元素时直接插入就行了。
2.插入了新区间后,不要忘记旧区间,旧区间也需要被一起被返回
/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
import java.util.ArrayList;

public class Solution {
    public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
        ArrayList<Interval> res = new ArrayList<>();
        int i = 0;
        while (i < intervals.size()){
            Interval in = intervals.get(i);
            if (in.start > newInterval.end){
                break;
            }
            else if (in.end < newInterval.start){
                i++;
                res.add(in);
            }else {
                i++;
                newInterval.start = Math.min(in.start,newInterval.start);
                newInterval.end = Math.max(in.end,newInterval.end);
            }
        }
        res.add(newInterval);
        for (;i<intervals.size();i++){
            res.add(intervals.get(i));
        }
        return res;
    }
}

 

posted @ 2020-07-16 20:44  硬盘红了  阅读(252)  评论(4编辑  收藏  举报