給定一個整數數組
A
,坡是元組(i, j)
,其中i < j
且A[i] <= A[j]
。這樣的坡的寬度爲j - i
。數組找出
A
中的坡的最大寬度,若是不存在,返回0
。優化示例1:指針
輸入:[6,0,8,2,1,5] 輸出:4 解釋: 最大寬度的坡爲 (i, j) = (1, 5): A[1] = 0 且 A[5] = 5.示例2:code
輸入:[9,8,1,0,1,9,4,0,4,1] 輸出:7 解釋: 最大寬度的坡爲 (i, j) = (2, 9): A[2] = 1 且 A[9] = 1.提示:索引
2 <= A.length <= 50000
0 <= A[i] <= 50000
本題中的元組我的感受是一個煙霧彈,就算不了解元組的概念也可以完成本題。本題的邏輯雖然不復雜,可是若是隻是按照邏輯實現,會出現Time Limit Exceeded
的狀況,須要在實現的代碼上進行算法的優化,減小循環次數從而避免 Time Limit Exceeded
。leetcode
本題的邏輯實現其實很簡單,使用雙指針法便可完成。
首先第一個指針有序的遍歷每一個元素,當第一個指針指向一個元素時,第二個指針則遍歷這個元素後的每個元素,並依次與第一個指針指向的元素進行比較,若是值比它小,則計算坡度並與當前最大坡度進行比較,記錄較大值。get
這個代碼是根據題意實現的基礎代碼,會出現Time Limit Exceeded
的狀況it
public int maxWidthRamp(int[] A) { //最大寬度 int maxWidth=0; for(int i=0;i<A.length-1;i++){ for(int j=i+1;j<A.length;j++){ if(A[i]<=A[j]){//比較兩個指針指向的元素值,知足A[i] <= A[j]則計算寬度 maxWidth=maxWidth>=(j-i)?maxWidth:j-i;//計算最大寬度 } } } return maxWidth; }
/** * 962. 最大寬度坡 * @param A * @return */ public int maxWidthRamp(int[] A) { //最大寬度 int maxWidth=0; //理論最大寬度 int mayMaxWidth=0; for(int i=0;i<A.length-1;i++){ //每次循環時,理論最大寬度應該不會超過數組最後一個元素的索引減去當前元素索引 mayMaxWidth=A.length-1-i; if(maxWidth>=mayMaxWidth){//超過理論最大值表示已經找到最大寬度坡,直接終止循環 break; } for(int j=i+1;j<A.length;j++){ if(A[i]<=A[j]){//比較兩個指針指向的元素值,知足A[i] <= A[j]則計算寬度 maxWidth=maxWidth>=(j-i)?maxWidth:j-i;//計算最大寬度 } } } return maxWidth; }