56. 合并区间https://leetcode-cn.com/problems/merge-intervals/
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
思想过程:
- 先把所有区间按照左排序,然后比较结果数组里的当前区间的右边界,和排序数组的右边界,取最大值;
- 当不满足合并条件或者数组为空的时候,就直接加入结果数组里;
- 另外还学到了对于区间进行排序的lambada表达式,
-
Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
假设传来两个值,v1
与v2
,那么他们的先后顺序以v1[0]
比v2[0]
的结果为准,即:若v1[0] < v2[0]
则v1 < v2
,若=
则=
,若>
则>
举一反三:
Arrays.sort(intervals, (v1, v2) -> v1[0] == v2[0] ? v2[1] - v1[1] : v1[0] - v2[0]);
表示:传来两个值v1
与v2
,若[0]
相同,则按[1]
降序;若不同则按[0]
升序。
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length<=1)
return intervals;
Arrays.sort(intervals,new Comparator<int[]>(){
@Override
public int compare(int[]o1,int[]o2){
//[]里面写0,就是按照第一位排序
return o1[0]-o2[0];
}
});
int index=-1;//记录答案区间个数
int[][] ans = new int[intervals.length][2];
for(int i=0;i<intervals.length;i++){
//数组为空,或者不满足合并条件,就直接加入结果数组
if(index==-1||intervals[i][0] > ans[index][1]){
index++;
ans[index][0] = intervals[i][0];
ans[index][1] = intervals[i][1];
}else{
ans[index][1] = Math.max(intervals[i][1],ans[index][1]);
}
}
return Arrays.copyOf(ans, index + 1);
}
}
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。
思想过程:
- 这个跟合并不一样,是进行右排序,按数组的右边界排序,依次比较相邻数组的左边界值和右边界值大小,想左<右,则数量+1;
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals,new Comparator<int[]>(){
@Override
public int compare(int[]o1,int[]o2){
return o1[1]-o2[1];
}
});
int count=1;//第一个区间默认保留了
int pre = intervals[0][1];
for(int i=1 ; i<intervals.length;i++){
if(intervals[i][0] >=pre){
count++;
pre = intervals[i][1];
}
}
return intervals.length-count;
}
}
插入区间还没碰到,到时候再写了