題目出自數據結構與算法分析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);
}
}