Leetcode 56. Merge Intervals
题目链接: Merge Intervals
难度:Medium
题目大意:
输入一些数值区间,将有重叠的区间进行合并,如[1,3]和[2,5]合并为[1,5],[1,4]和[2,3]合并为[1,4]。返回合并后的区间。
思路:
将区间数组按区间左边的值从小到大进行排序,然后遍历这些区间,判断相邻的两个区间是否要合并。
代码
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> list=new ArrayList<int[]>();
int n=intervals.length;
for(int i=0;i<n;i++){
list.add(intervals[i]);
}
Collections.sort(list,(o1,o2)->o1[0]-o2[0]);
//按区间左边的值从小到大进行排序
boolean[] remain=new boolean[n];//判断list.get[i]是否要保留
Arrays.fill(remain,true);
for(int i=1;i<list.size();i++){
if(list.get(i)[0]<=list.get(i-1)[1]){
if(list.get(i)[1]>=list.get(i-1)[1]){//比如[1,4]和[2,5]
list.get(i)[0]=list.get(i-1)[0];
remain[i-1]=false;
}
else{//比如[[1,4],[2,3]]
list.get(i)[0]=list.get(i-1)[0];
list.get(i)[1]=list.get(i-1)[1];
remain[i-1]=false;
}
}
}
List<int[]> res=new ArrayList<int[]>();
for(int i=0;i<list.size();i++){
if(remain[i]){
res.add(list.get(i));
}
}
int[][] ans=new int[res.size()][2];
int i=0;
for(int[] arr:res){
ans[i++]=arr;
}
return ans;
}
}