ウサギシリーズブラシ質問リートコードシリーズ4インターバルマージ

インターバルマージ

芯:

核となるのは間隔です。間隔の表現、間隔の並べ替え、間隔のマージはすべて私たちが気にかけている問題であり、習得する必要があります。この点で、分類と議論は非常に明確な方法です。

最初のマージ間隔

[外部リンク画像の転送に失敗しました。ソースサイトにリーチ防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-T7QyMCKe-1585809417353)(B4ACBAC4686640108CD7A86AC0ACEE9B)]

アイデア:

最初に並べ替えてから、マージのコアアイデアに従って間隔をマージします[外部リンク画像の転送が失敗します。ソースサイトにリーチング防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-MLpxTqFS-1585809417354)(84E8253836D14A7BA3A96A57E9917256)] [外部リンク画像転送失敗した場合は、ソースサイトにリーチ防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-9a2LzaFe-1585809417356)(D84A285A81FD4583BC6E33F53D1EC1EF))

コード:

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番目の間隔を挿入します

[外部リンク画像の転送に失敗しました。ソースサイトにリーチ防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-OitIiMRI-1585809417361)(B9A10E8D3E174F3BAD50142947E3E1D4)]

アイデア:

[外部リンク画像の転送に失敗しました。ソースサイトにリーチ防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-odSQ1740-1585809417364)(ADB9900FB9C841748AE1A6EA80BDD315)]
ここに写真の説明を挿入
適切な分類の場合、コードを作成するときに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;
	}
}

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/hch977/article/details/105269494