题目描述
目录
做题思路
这道题很容易想到从前往后遍历然后判断是否重合,然后重新设置区间的两个端点合并区间。
但是有一种可能是最后一个区间可能和第一个区间重合那么你按顺序只比较相邻的两个这种做法是很显然不对的
为来避免着这种情况,我们先把数组按照它的左端点升序排序,然后在依次遍历判断当前区间是否和前面的区间是否重合然后合并
排完序后就是具体实现思路
设置一个ArrayList集合 list 存放 一个不会和其他区间重合的区间(区间用用两个端点star end表示)。
先让 star end 为第一个区间的两个端点,如果第二个区间和第一个区间重合
那么intervals[1][0]<intervals[0][0] 然后用end =Math.max(end,intervals[1][1])来决定合并后区间的后端点
如果第一个区间和第二个区间不重合那么将star end存入list集合中,然后将star end'的值改成第二个区间左右端点的值重复上述操作
代码
class Solution {
public void swap(int[][]a,int i,int j){
int t=a[i][0];
a[i][0]=a[j][0];
a[j][0]=t;
t=a[i][1];
a[i][1]=a[j][1];
a[j][1]=t;
}
public int max(int a,int b){
return a>b?a:b;
}
public int min(int a,int b){
return a<b?a:b;
}
public int[][] merge(int[][] intervals) {
int len = intervals.length;
for(int i=0;i<len;i++){
for(int j=0;j<len-1-i;j++){
if(intervals[j][0]>intervals[j+1][0]){
swap(intervals,j+1,j);
}
}
}
ArrayList<Integer> list = new ArrayList<>();
int sart=intervals[0][0];
int end=intervals[0][1];
if(0==len-1){
list.add(sart);
list.add(end);
}
for(int i=1;i<len;i++){
//判断当前区间和上一个区间是否重叠
int s=intervals[i][0];
int e=intervals[i][1];
if(s>=sart&&s<=end){
end=max(end,e);
if(i==len-1){
list.add(sart);
list.add(end);
}
}
else {
list.add(sart);
list.add(end);
sart=intervals[i][0];
end=intervals[i][1];
if(i==len-1){
list.add(sart);
list.add(end);
}
}
}
int k=0;
int[][] dp=new int[list.size()/2][2];
for(int i=0;i<list.size();i=i+2){//最后将list存的值成对的转发为二维数组
dp[k][0]=list.get(i);
dp[k++][1]=list.get(i+1);
}
return dp;
}
}