目录
56. 合并区间Merge Intervals (medium)
57. 插入区间Insert Interval (medium)
986. 区间列表的交集Intervals Intersection (medium)
Conflicting Appointments (medium)
区间合并模式是一个用来处理有区间重叠的很高效的技术。在设计到区间的很多问题中,通常咱们需要要么判断是否有重叠,要么合并区间,如果他们重叠的话。这个模式是这么起作用的:
假设第一个区间的起始位置小于第二个区间的起始位置,有6种不同的情况
理解和识别这六种情况,非常重要。因为这能帮你解决一大堆问题。这些问题从插入区间到优化区间合并都有。
判断合并区间模式
- 当你需要产生一堆相互之间没有交集的区间的时候
- 当你听到重叠区间的时候
力扣经典题
56. 合并区间Merge Intervals (medium)
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals,(a,b)->a[0]-b[0]);//先排好序
int len=intervals.length;
int[][] ans=new int[len][2];
int a=-1;//a+1代表ans中已有区间的个数
for(int i=0;i<len;i++){
if(a==-1||ans[a][1]<intervals[i][0]){//设置往ans填入区间的条件
a++;
ans[a][0]=intervals[i][0];
ans[a][1]=intervals[i][1];
}else{//其他情况就是发现空间重合了,需要修改ans中的区间数据
ans[a][1]=Math.max(ans[a][1],intervals[i][1]);
}
}
return Arrays.copyOf(ans,a+1);
}
}
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals,(a,b)->a[0]-b[0]);//先排好序
int len=intervals.length;
if(len==1){
return intervals;
}
int[][] ans=new int[len][2];
int k=0;
int[] a=intervals[0];
for(int i=1;i<len;i++){
if(a[1]<intervals[i][0]){
ans[k]=a;
k++;
a=intervals[i];
}else{
a[1]=Math.max(a[1],intervals[i][1]);
}
}
ans[k]=a;
return Arrays.copyOf(ans,k+1);
}
}
57. 插入区间Insert Interval (medium)
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
//Arrays.sort(intervals,(a,b)->a[0]-b[0]);排序
int len=intervals.length;
int[][] ans=new int[len+1][2];
if(len==0){
int[][] res=new int[1][2];
res[0][0]=newInterval[0];
res[0][1]=newInterval[1];
return res;
}
int a=0;//a代表ans中存在区间的个数
int k=0;
int g=0;
for(int i=0;i<len;i++){//依次判断区间是否在newInterval中,若是,则
if(intervals[i][0]>newInterval[1]||intervals[i][1]<newInterval[0]){
if(k!=0){
ans[a][0]=newInterval[0];
ans[a][1]=newInterval[1];
a++;
k=0;
g++;
}
ans[a][0]=intervals[i][0];
ans[a][1]=intervals[i][1];
a++;
}else{
k++;
newInterval[0]=Math.min(newInterval[0],intervals[i][0]);
newInterval[1]=Math.max(newInterval[1],intervals[i][1]);
}
}
if(g==0){
ans[a][0]=newInterval[0];
ans[a][1]=newInterval[1];
a++;
k=0;
}
int[][] ans1=Arrays.copyOf(ans,a);
Arrays.sort(ans1,(b,c)->b[0]-c[0]);
return ans1;
}
}
986. 区间列表的交集Intervals Intersection (medium)
class Solution {
public int[][] intervalIntersection(int[][] A, int[][] B) {
List<int[]> ans=new ArrayList<>();
int i=0,j=0;//作为标记AB当前的指针
int len1=A.length;
int len2=B.length;
while(i<len1&&j<len2){
int hi=Math.min(A[i][1],B[j][1]);
int lo=Math.max(A[i][0],B[j][0]);
if(hi>=lo){
ans.add(new int[]{lo,hi});
}
if(A[i][1]<B[j][1]){
i++;
}
else{
j++;
}
}
return ans.toArray(new int[ans.size()][]);
}
}
Conflicting Appointments (medium)
力扣题
435. 无重叠区间