兔系刷題leetcode系列之四 區間合併

區間合併

核心:

其核心是區間,區間這一對象的表示,區間的排序,區間的合併,這都是我們關心且要熟練掌握的問題,在這方面分類討論是一個很清晰的方法。

第一道 合併區間

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(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);
		}
	}
}

第二道 區間插入

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OitIiMRI-1585809417361)(B9A10E8D3E174F3BAD50142947E3E1D4)]

思路:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-odSQ1740-1585809417364)(ADB9900FB9C841748AE1A6EA80BDD315)]
在這裏插入圖片描述
在分類好情況下,編寫代碼時考慮刪除和插入兩部分進行,會簡便很多。

代碼:

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;
	}
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章