インターバルマージ
芯:
核となるのは間隔です。間隔の表現、間隔の並べ替え、間隔のマージはすべて私たちが気にかけている問題であり、習得する必要があります。この点で、分類と議論は非常に明確な方法です。
最初のマージ間隔
アイデア:
コード:
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);
}
}
}
2番目の間隔を挿入します
アイデア:
適切な分類の場合、コードを作成するときに2つの部分の削除と挿入を検討する方がはるかに簡単です。
コード:
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;
}
}
3番目の間隔リストの共通部分
アイデア:
この質問は本当に良いです!!!!
デュアルポインター知識+間隔マージ知識を使用する
この質問は本当に良いです!!!!
デュアルポインター知識+間隔マージ知識を使用する
コード:
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;
}
}