leetcode56 合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路:
-
将整个数组按照第一个元素的值排序
-
考虑整个数组是有序的,只要后一个区间的开头比前一个的末尾小,这两个区间即可合并成一个区间。更严谨的来说,应该是后一个区间的开头比左边所有区间末尾最大值大即可。这里通过一个while循环来进行判断,并通过变量right记录当前未合并的区间末尾的最大值。
class Solution { public int[][] merge(int[][] intervals) { if(intervals==null) return null; int row=intervals.length; List<int[]> res=new ArrayList<>(); Arrays.sort(intervals,(a,b)->a[0]-b[0]);//用lambda表达式作为参数进行排序 for(int i=0;i<row;i++){ int t=i; int right=intervals[i][1]; while(i<row-1&&right>=intervals[i+1][0]){ i++; right=Math.max(right,intervals[i][1]);//比较right和当前区间的末尾哪个大 } res.add(new int[]{intervals[t][0],right}); } return res.toArray(new int[res.size()][2]); } }
leetcode57 合并区间2
与56题同理,只需将新加入的数组插入并进行排序,后续的做法与上题都一样。
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]>list=new ArrayList<>();
int row=intervals.length;
for(int i=0;i<row;i++){
list.add(intervals[i]);
}
list.add(newInterval);
int p[][]=list.toArray(new int[list.size()][2]);
list=new ArrayList<>();
Arrays.sort(p,(a,b)->a[0]-b[0]);
row++;//注意行数变多一行
for(int i=0;i<row;i++){
int right=p[i][1];
int left=p[i][0];
while(i<row-1&&right>=p[i+1][0]){
i++;
right=Math.max(right,p[i][1]);
}list.add(new int[]{left,right});
}
return list.toArray(new int[list.size()][2]);
}
}