[LeetCode]56. 合并区间(java实现)
1. 题目
2. 读题(需要重点注意的东西)
思路(贪心):
① 按左端点排序,依次遍历一遍
② 有交集,则更新右端点
③ 没有交集,则保存当前区间
3. 解法
---------------------------------------------------解法---------------------------------------------------:
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> list = new ArrayList<>();
if(intervals.length == 0) return new int[0][0];
Arrays.sort(intervals,(x,y) -> x[0]-y[0]);
int start = intervals[0][0],end = intervals[0][1];
for(int i = 1;i < intervals.length;i++){
// 合并
if(intervals[i][0] <= end) end = intervals[i][1] > end ? intervals[i][1] : end;
else{
list.add(new int[]{start,end});
start = intervals[i][0];
end = intervals[i][1];
}
}
list.add(new int[]{start,end});
return list.toArray(new int[0][]);
}
}
可能存在的问题:
问题一: 二维数组如何排序?
二维数组排序:Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
Arrays.sort完整方法:
Arrays.sort(intervals, new Comparator<int[]>(){
@Override
public int compare(int[] a, int[] b) {
return a[0]-b[0];//如果这个值大于0,则是升序
}
后面的匿名类可以写成Lambda表达式,可以省略函数名,返回值类型和return 关键字,只要给定参数(a,b),直接得到一个表达式的结果即为:Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
问题二: list如何转为二维数组?
list.toArray(new int[0][])