給定乙個長度為n
(n>1
) 的整型陣列a
,可以將a
劃分成左右兩個部分,左部分a[0..k]
,右部分a[k+1..n-1]
,k
可以取值的範圍是[0,n-2]
。
求這麼多劃分方案中,左部分中的最大值減去右部分最大值的絕對值,最大是多少?
給定整數陣列a
和陣列的大小n
,請返回題目所求的答案。
示例1:
要求兩個最大值的差, 所以肯定可以找到整個陣列的最大值, 然後就可以確定一邊的最大值了;
另一邊的最大值就是要找左右兩端最小那個數, 因為無論他們怎麼往外擴都只能增大,不能減小
所以最大差值就是第一次找出來的最大值和左右兩邊小的那個數的差了。
這兩個數中有乙個肯定是陣列的最大值。要使得差值最大,那麼另一邊的最大值應盡可能的小。
假設最大值在左邊,那麼對於最大值右邊的陣列有很多種分法,每一種分法肯定都包含陣列最後乙個數字即a[n-1]
。
如果不取a[n-1]
,取最後乙個數字和最大值中間的任一數字a[i]
。
所以無論如何右半邊取最右端數字。
假設最大值在右邊,同理左半邊取最左端數字。
只需用陣列最大值減去陣列兩端較小的那個值即可。
【最大差值就是最大值和左右兩邊最小的那個數的差】
class
maxgap
};
按照題意,暴力求解。
class
maxgap
int rightmax =
a[k+1]
;for
(int i = k+
1;i < n;
++i)if(
abs(leftmax - rightmax)
> max)
max =
abs(leftmax - rightmax);}
return max;}}
;
按照題意, 將i
為0
到n-1
的情況都羅列出來即可.
建立mxl
記錄i
位左側最大值, 建立mxr
記錄i
位右側最大值. 這是在找最大值.
核心要體會到 第i
位左側的最大值就是i - 1
位最大值和i
的值的較大值.
例如輸入資料為[2,7,3,1,1]
,mxl
中的值為:[2,7,7,7,7]
,mxr
中的值為:[7,7,3,1,1]
然後再拿著每個位置的最大值依次去和陣列的每個元素做減法, 來找到差值的最大.
class
maxgap
for(int i=n-
1;i>=
0;i--
)// 例如輸入資料為 [2,7,3,1,1]
// mxl 中的值為: [2,7,7,7,7]
// mxr 中的值為: [7,7,3,1,1]
int res=
int_min
;// 接下來的迴圈就依次求差找最大值即可.
for(int i=
0;i1;i++
)return res;}}
;
左右最值最大差
給定乙個長度為n n 1 的整型陣列a,可以將a劃分成左右兩個部分,左部分a 0.k 右部分a k 1.n 1 k可以取值的範圍是 0,n 2 求這麼多劃分方案中,左部分中的最大值減去右部分最大值的絕對值,最大是多少?給定整數陣列a和陣列的大小n,請返回題目所求的答案。測試樣例 2,7,3,1,1 ...
左右最值最大差
題目 給定乙個長度為n n 1 的整型陣列a,可以將a劃分成左右兩個部分,左部分a 0 k 右部分a k 1 n 1 k可以取值的範圍是 0,n 2 求這麼多劃分方案中,左部分中的最大值減去右部分最大值的絕對值,最大是多少?給定整數陣列a和陣列的大小n,請返回題目所求的答案。測試樣例 2,7,3,1...
左右最值最大差
給定乙個長度為n n 1 的整型陣列a,可以將a劃分成左右兩個部分,左部分a 0 k 右部分a k 1 n 1 k可以取值的範圍 0,n 2 求這麼多劃分方案中,左部分中的最大值減去右部分最大值的絕對值,最大是多少?給定整數陣列a和陣列的大小n,請返回題目所求的答案。題目可以理解為,a中的最大元素值...