未验证 提交 66747935 编写于 作者: B BruceCat 提交者: GitHub

【56. 合并区间】【java】

【56. 合并区间】【java】
......@@ -90,5 +90,66 @@ def merge(intervals):
<p align='center'>
<img src="../pictures/qrcode.jpg" width=200 >
</p>
======其他语言代码======
~~~java
class Solution {
/**
* 1. 先对区间集合进行排序(根据开始位置)
* 2. 合并的情况一共有三种
* a. b. c.
* |---------| |--------| |--------|
* |---------| |--| |--------|
* a和b两种情况,合并取右边界大的值,c情况不合并
*
*/
private int[][] tmp;
public int[][] merge(int[][] intervals) {
if(intervals == null ||intervals.length == 0)return new int[0][0];
int length = intervals.length;
//将列表中的区间按照左端点升序排序
// Arrays.sort(intervals,(v1,v2) -> v1[0]-v2[0]);
this.tmp = new int[length][2];
sort(intervals,0,length-1);
int[][] ans = new int[length][2];
int index = -1;
for(int[] interval:intervals){
// 当结果数组是空是,或者当前区间的起始位置 > 结果数组中最后区间的终止位置(即上图情况c);
// 则不合并,直接将当前区间加入结果数组。
if(index == -1 || interval[0] > ans[index][1]){
ans[++index] = interval;
}else{
// 反之将当前区间合并至结果数组的最后区间(即上图情况a,b)
ans[index][1] = Math.max(ans[index][1],interval[1]);
}
}
return Arrays.copyOf(ans, index + 1);
}
//归并排序
public void sort(int[][] intervals,int l,int r){
if(l >= r)return;
int mid = l + (r-l)/2;
sort(intervals,l,mid);
sort(intervals,mid+1,r);
//合并
int i=l,j=mid+1;
for(int k=l;k<=r;k++){
if(i>mid)tmp[k]=intervals[j++];
else if(j>r)tmp[k]=intervals[i++];
else if(intervals[i][0]>intervals[j][0])tmp[k] = intervals[j++];
else tmp[k] = intervals[i++];
}
System.arraycopy(tmp,l,intervals,l,r-l+1);
}
}
~~~
======其他语言代码======
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册