求一個數組(a(i,j))中元素相減的最大值,且i

題目的要求是時間複雜度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);
	}

}


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