題目的要求是時間複雜度O(n),空間複雜度O(1).
兩個錯誤的思路要避免,一是數組排序,最好的排序算法時間複雜度也是nlogn,明顯達不到要求。另外一個是遍歷數組求得最大值和最小值,然後相減,但照顧不到i<=j的條件。
正確的思路是對上述第二個算法的改進,將數組第一個元素設置爲最大和最小值(i=j=0),最大差值的初始值max就是0,然後移動j,每次移動都計算a[j]-a[i],如果結果大於max就替換max,小於的話什麼都不做,而如果結果小於0,則將i賦值爲j,繼續上面的操作。最終得到的結果就是正確答案。
java實現的代碼如下
public class MaxSubtractValueOfArrays {
//Find the max value of elements subtract when i <= j
public static int getMaxSubtractValueofArrays(int a[]){
int i = 0;
int max = 0;
for(int j = 1; j < a.length ; j++){
int sub = a[j] - a[i];
if(sub > max)
max = sub;
else if(sub < 0){
i = j;
}
}
return max;
}
public static void main(String[] args) {
int a[] = {6,18,3,98,67,24,0,43,17,17,67,81,49,-15,9};
int max = MaxSubtractValueOfArrays.getMaxSubtractValueofArrays(a);
System.out.println(max);
}
}