左右最值最大差問題
作者:Grey
原文地址: 左右最值最大差問題
題目鏈接
描述
給定一個長度爲N(N>1)的整型數組A,可以將A劃分成左右兩個部分,左部分
A[0..K]
,右部分A[K+1..N-1]
,K可以取值的範圍是[0,N-2]
。求這麼多劃分方案中,左部分中的最大值減去右部分最大值的絕對值,最大是多少?
給定整數數組A和數組的大小n,請返回題目所求的答案。
測試樣例:
A:[2,7,3,1,1]
n:5
返回:6
主要思路
假設數組長度爲len
,遍歷一遍數組,得到數組的最大值max
,然後比較0
位置和len-1
位置的值,取較小的那個,假設爲m
,則max - m
即爲答案。
完整代碼
public class MaxGap {
public int findMaxGap(int[] A, int n) {
int max = A[0];
int len = A.length;
for (int i = 1; i < len; i++) {
max = Math.max(A[i], max);
}
return max - (Math.min(A[0], A[len - 1]));
}
}
證明
由於全局最大值是max
,所以無論max
被劃分到哪個部分,都會成爲這部分的最大值。假設max
被劃分到了右邊部分,所以右邊部分的最大值就是max
,假設左邊部分的最大值是m
,那麼max - m
即爲一個答案候選。要使得max - m
最大,而左邊部分不能爲空,所以左邊部分必須要包含0
位置的值,所以,在左邊只包含0
位置值的時候,max - m
才能做到最大,即:max - arr[0]
;同理,假設max
被劃分到了左邊,右邊最大值假設爲n
,要使得max - n
最大,len - 1
位置的值又必須包含在右邊,那麼max - arr[len-1]
纔是最大的。所以最終的答案就是:
max - Math.min(arr[0],arr[len-1]);