求a[j]-a[i]的最大值,其中j>=i

題目出自數據結構與算法分析2.28


常規思路是用兩個for循環嵌套,但是時間複雜度會是O(N²)。


然後書中推薦的方法是O(N),先給出思路和代碼:


首先最大值的初始值應該是0,當i=j時

要找到a[j]-a[i]的最大值,也就是找到a[j]之前的最小值,所以當下標j向前掃描時,如果相減的值大於當前最大值,則更新最大值,如果相減的值小於0,也就是a[j]小於a[i],此時將最小值設定爲當前的a[j],即i=j,然後繼續掃描至結束。


整個過程只對數組進行一次掃描,即下標j不斷向前。

public class Max
{
	public static void main(String[] args){
		int[] arr = new int[]{5,2,3,7,4,9,6,2,4,7};
		int maxi = arr[0];		//記錄j之前最小的a[i]
		int maxMinus = 0;		//記錄最大差值
		int a = 0;				//記錄最大差值的i下標
		int b = 0;				//記錄最大差值的j下標
		int temp = 0;			//暫存最大差值的i下標
		for (int j = 0; j < arr.length ; j++)
		{
			if ((arr[j] - maxi) > maxMinus)	//當小於當前的最大差值時
			{
				maxMinus = arr[j] - maxi;		//更新最大差值
				a = temp;
				b = j;
				
			}
			else if ((arr[j] - maxi) < 0)		//當小於當前最小的a[i]時
			{
				maxi = arr[j];				//更新最小的a[i]
				temp = j;
			}
		}
		System.out.println("最大差值是a[" + b + "]-[" + a + "]=" + maxMinus);
	}
}


發佈了36 篇原創文章 · 獲贊 0 · 訪問量 4978
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章