最大的 leftmax 與 rightmax 之差的絕對值
給定乙個長度為n(n>1)的整型陣列arr,可以劃分成左右兩個部分,左部分arr[0..k],右部分arr[k+1..n-1],k可以取值的範圍是[0,n-2]。求這麼多劃分方案中,左部分中的最大值減去右部分最大值的絕對值,最大是多少?
例如[2,7,3,1,1],當左部分為[2,7],右部分為[3,1,1]時,左部分中的最大值減去右部分最大值的絕對值為4。當左部分為[2,7,3],右部分為[1,1]時,左部分中的最大值減去右部分最大值的絕對值為6。還有很多劃分方案,但最終返回6。
方法有三,我們來逐一破解。
1、最笨的方法,遍歷每個元素,按照每個進行分割,然後分別找出左側和右側的最大值,留下最大的差值。
毋庸置疑,時間複雜度o(n2),**也就不演示了。
2、我們可以用空間換時間,將時間複雜度降低為o(n),空間複雜度公升為o(n)。
我們可以先對陣列進行預處理,預先計算出0~i之間的最大值存入陣列,再計算出i~n-1的最大值存入陣列。
例如: 2 7 3 1 1,從0~~i(從左至右)最大值依次為 2 7 7 7 7,存入left陣列,然後i~~n-1(從右至左)的最大值依次為 7 7 3 1 1,存入right陣列,此時我們僅僅需要判斷按照每乙個分割時,兩個最大值相減,哪個最大即可。
public static int method_2(int arr)
for(int i=0;i
3、空間換時間固然不錯,但是我們換個角度想一想。無論怎麼分,最大值要麼早左邊要麼在右邊,而且最大值永遠是被減數。假設最大值在左邊,那麼我們的任務就是將右側的最大值選擇的盡可能小,那麼就會只有一種情況,那就是當只包含最右邊的元素時,同理當最大值在右邊,那麼另乙個就是只包含最左側的,類似例子2 3 7 1 6,最大值是7,包含2 和包含2 3的效果不一樣。所以我們還要做的是判斷左邊的和右邊的哪個和最大值相減後獲得的結果最小,那麼就按照那種分割方法。
public static int method_3(int arr)
return math.max(max-arr[0], max-arr[arr.length-1]);
}
牛客堂常見面試題精講(一)1
順時針旋轉列印矩陣 演算法 package com.zhao.niuke public class problem 02 rotatematrix public static void rotateedge int m,int tr,int tc,int dr,int dc public stati...
牛客堂常見面試題精講(一)2
轉圈列印矩陣的演算法思想 package com.zhao.niuke public class problem 01 printmatrixspiralorder public static void printedge int m,int tr,int tc,int dr,int dc else...
常見面試題之陣列
參考文獻 1.程式設計之美 2.劍指offer 3.王道程式設計師求職寶典 常見題如下 1.二維陣列中查詢某個數,該陣列滿足 左 右 遞增,上 下 遞增。利用二分查詢的思想 2.求旋轉陣列中的最小數字。3.利用迴圈優化斐波那契數列。4.調整陣列順序,使奇數字於偶數之前。5.求陣列中出現出現次數超過一...