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; } }
学习的博客多用于在笔记中,防止笔记过于臃肿,所以将样例及运行结果放在博客中,后以超链接的形式记录在笔记中,所以有些博文过于单薄。如果有小伙伴遇到问题欢迎评论,看到就会回复,学渣一枚,加油努力。