【算法證明含證明過程】數組左部分中的最大值減去右部分最大值的絕對值,最大是多少?

題目描述:給定一個長度爲N的整型數組arr,可以劃分成左右兩個部分: 左部分arr[0..K],右部分arr[K+1..arr.length-1],K可以取值的範圍是[0,arr.length-2] 求這麼多劃分方案中,左部分中的最大值減去右部分最大值的絕對值,最大是多少? 例如: [2,7,3,1,1] 當左部分爲[2,7],右部分爲[3,1,1]時,左部分中的最大值減去右部分最大值的絕對值爲4; 當左部分爲[2,7,3],右部分爲[1,1]時,左部分中的最大值減去右部分最大值的絕對值爲6; 最後返回的結果爲6。 注意:如果數組的長度爲N,請儘量做到時間複雜度O(N),額外空間複雜度O(1)。證明如下算法的正確性:

算法步驟:1. 求出數組中最大的元素,記爲MAX;2. 記MIN = min(arr[0],arr[arr.length-1]);3. MAX - MIN即爲所求。

證明如下:記左部分最大值和右部分最大值中較大的一個爲bigMax,較小的一個爲smallMax。由題即求bigMax-smallMax的最大值。由式bigMax-smallMax可知,bigMax越大,smallMax越小則bigMax-smallMax值越大。故bigMax必爲數組中的最大值,記爲MAX。假設現在以MAX作爲劃分點,並假設MAX左右均有元素存在(若MAX爲arr[0]或arr[arr.length-1]同理)。現在考慮以MAX爲劃分時,左部分的情況:將左部分分爲arr[0]和從arr[0]到MAX的兩部分,若arr[0]是左部分的最大值,則smallMAX就選arr[0](在這種情況下,假設不以MAX爲劃分,而以MAX左邊的某一個元素劃分,由於必有smallMAX<MAX,smallMAX仍要選arr[0])。否則若arr[0]不是左部分的最大值,由於要使得smallMAX越小越好而此時左部分的最大值必然是存在於arr[1]到MAX之間的某個值,只有選arr[0]爲smallMAX並以arr[1]爲劃分才能使得bigMax-smallMax值越大(可以證明,除此之外的劃分無論如何仍然要選arr[0]爲smallMAX)。綜上,左部分的最大值無論如何都是選arr[0]。另外,若要使得某一部分的值既是這一部分的最大值,又是這一部分的最小值。那麼只有當這一部分只含有一個元素時,這個元素同時滿足這兩個條件。同理可證明右部分最大值無論如何都是選arr[arr.length-1]。綜合考慮smallMax= min(arr[0],arr[arr.length-1])。由此得證。


 public int getMaxABSLeftAndRight(int[] arr) {
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < arr.length; i++) {
            max = Math.max(arr[i], max);
        }
        return max - Math.min(arr[0], arr[arr.length - 1]);

  }



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