算法步驟: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]);
}