区间合并
核心:
其核心是区间,区间这一对象的表示,区间的排序,区间的合并,这都是我们关心且要熟练掌握的问题,在这方面分类讨论是一个很清晰的方法。
第一道 合并区间
思路:
代码:
class Solution {
public static class Interval
{
int a;
int b;
public Interval(int a,int b)
{
this.a=a;
this.b=b;
}
}
public static class mycomparator implements Comparator<Interval>
{
@Override
public int compare(Interval arg0, Interval arg1) {
if(arg0.a<arg1.a)
{
return -1;
}
else if(arg0.a==arg1.a)
return 0;
else
return 1;
}
}
public int[][] merge(int[][] intervals) {
int n=intervals.length;
List<Interval> aList=new ArrayList<>();
for(int i=0;i<n;i++)
{
Interval a=new Interval(intervals[i][0], intervals[i][1]);
aList.add(a);
}
Collections.sort(aList,new mycomparator());
// System.out.println("排序后:");
// for(int j=0;j<aList.size();j++)
// {
// System.out.print("["+aList.get(j).a+","+aList.get(j).b+"] ");
// }
int q=0;
while(q<aList.size()-1)
{
// System.out.println("q:"+q);
Interval t1=aList.get(q);
Interval t2=aList.get(q+1);
// System.out.println("待合并区间1:[ "+aList.get(q).a+","+aList.get(q).b+"]");
// System.out.println("待合并区间2:[ "+aList.get(q+1).a+","+aList.get(q+1).b+"]");
if(t1.b>=t2.a)
{
aList.set(q, merge(t1, t2));
aList.remove(q+1);
}
else
{
q=q+1;
}
// System.out.println("更新后:");
// for(int j=0;j<aList.size();j++)
// {
// System.out.print("["+aList.get(j).a+","+aList.get(j).b+"] ");
// }
}
int[][] result=new int[aList.size()][2];
for(int i=0;i<aList.size();i++)
{
result[i][0]=aList.get(i).a;
result[i][1]=aList.get(i).b;
}
return result;
}
public static Interval merge(Interval t1,Interval t2)
{
// System.out.println("合并后:");
if(t2.b<=t1.b)
{
// System.out.println("左边界:"+t1.a);
// System.out.println("右边界:"+t1.b);
return t1;
}
else if(t1.a>=t2.a)
{
// System.out.println("左边界:"+t2.a);
// System.out.println("右边界:"+t2.b);
return t2;
}
else {
// System.out.println("左边界:"+t1.a);
// System.out.println("右边界:"+t2.b);
return new Interval(t1.a,t2.b);
}
}
}
第二道 区间插入
思路:
在分类好情况下,编写代码时考虑删除和插入两部分进行,会简便很多。
代码:
class Solution {
public static class Interval
{
int a;
int b;
public Interval(int a,int b)
{
this.a=a;
this.b=b;
}
}
public int[][] insert(int[][] intervals, int[] newInterval) {
List<Interval> aList=new ArrayList<>();
int aq=newInterval[0];
int bq=newInterval[1];
int t1=-1;
int t2=-1;
int indexa=0;
int indexb=-1;
for(int i=0;i<intervals.length;i++)
{
int a1=intervals[i][0];
int a2=intervals[i][1];
if(aq>a2)
{
indexa=i+1;
}
if(bq>a2)
{
indexb=i;
}
if(aq>=a1&&aq<=a2)
{
t1=a1;
indexa=i;
}
if(bq>=a1&&bq<=a2)
{
t2=a2;
indexb=i;
}
Interval tInterval=new Interval(a1, a2);
aList.add(tInterval);
}
// System.out.println("indexa:"+indexa);
// System.out.println("indexb:"+indexb);
if(t1==-1)
{
t1=aq;
}
if(t2==-1)
{
t2=bq;
}
// System.out.println("t1:"+t1);
// System.out.println("t2:"+t2);
int u=indexb-indexa+1;
for(int i=0;i<u;i++)
{
if(indexa>=0&&indexa<aList.size())
{
aList.remove(indexa);
}
}
Interval uInterval=new Interval(t1, t2);
aList.add(indexa,uInterval);
int[][] result=new int[aList.size()][2];
for(int j=0;j<aList.size();j++)
{
result[j][0]=aList.get(j).a;
result[j][1]=aList.get(j).b;
}
return result;
}
}
第三道 区间列表的交集
思路:
这道题真的很精华!!!!
用了双指针知识+区间合并知识
这道题真的很精华!!!!
用了双指针知识+区间合并知识
代码:
class Solution {
public static class Interval
{
int a;
int b;
public Interval(int a,int b)
{
this.a=a;
this.b=b;
}
}
public int[][] intervalIntersection(int[][] A, int[][] B) {
int i=0;
int j=0;
List<Interval> aList=new ArrayList<>();
while(true)
{
if(j==B.length||i==A.length)
break;
int a1=A[i][0];
int a2=A[i][1];
int b1=B[j][0];
int b2=B[j][1];
if(a1>b2||b1>a2)
{
}
else {
int t1=Integer.max(a1, b1);
int t2=Integer.min(a2, b2);
Interval tInterval=new Interval(t1, t2);
aList.add(tInterval);
}
if(a2==b2)
{
i++;
j++;
}
else if(a2>b2)
{
j++;
}
else if(a2<b2)
{
i++;
}
}
int[][] result=new int[aList.size()][2];
for(int l=0;l<aList.size();l++)
{
result[l][0]=aList.get(l).a;
result[l][1]=aList.get(l).b;
}
return result;
}
}