給定乙個整數陣列 a,如果它是有效的山脈陣列就返回 true,否則返回 false。讓我們回顧一下,如果 a 滿足下述條件,那麼它是乙個山脈陣列:
a.length >= 3在 0 < i < a.length - 1 條件下,存在 i 使得:
a[0] < a[1] < … a[i-1] < a[i]
a[i] > a[i+1] > … > a[a.length - 1]
輸入:[2,1]輸出:false
輸入:[3,5,5]
輸出:false
輸入:[0,3,2,1]
輸出:true
public
boolean
validmountainarray
(int
a)//山峰在0 和 最後,不符合山脈陣列
if(i==
0|| i == length-1)
//下山,如果下山能一直到達陣列末尾,則為山脈陣列
while
(i+1
< length && a[i]
> a[i+1]
)//判斷下山是否能到達陣列末尾
return i == length-1;
}
我們把陣列 a 中符合下列屬性的任意連續子陣列 b 稱為 「山脈」:
b.length >= 3存在 0 < i < b.length - 1 使得 b[0] < b[1] < … b[i-1] < b[i] > b[i+1] > … > b[b.length - 1]
(注意:b 可以是 a 的任意子陣列,包括整個陣列 a。)
給出乙個整數陣列 a,返回最長 「山脈」 的長度。
如果不含有 「山脈」 則返回 0。
輸入:[2,1,4,7,3,2,5]輸出:5
解釋:最長的 「山脈」 是 [1,4,7,3,2],長度為 5。
輸入:[2,2,2]
輸出:0
解釋:不含 「山脈」。
/*
* 缺點:這種做法會使得陣列元素不止被訪問一次。
*/public
intlongestmountain
(int
a)int res =0;
for(
int i =
1; i < a.length -
1; i++
)// 向右查詢計算,直到遇到「谷」
while
(r < a.length -
1&& a[r]
> a[r +1]
)// 計算總長度
res = math.
max(res,
(r - l +1)
);}}
return res;
}
/*思路:與答案一類似。但這裡使用兩個變數 increasing 和 decreasing,
*分別記錄每個山脈上公升區間的長度以及下降區間的長度。通過遍歷,尋找最長的山脈。
* 相比答案一,這個做法效率更高,陣列中每個元素只被訪問一次
*/public
intlongestmountain
(int
a)while
(i < a.length && a[i -1]
> a[i])if
(increasing >
0&& decreasing >0)
//重要:如果「山」有平的,要手動跳過,不然會死迴圈
while
(i < a.length && a[i]
== a[i -1]
) i++;}
return res;
}
845 陣列中的最長山脈LeetCode
陣列中的最長山脈 題目描述提示幫助提交記錄社群討論閱讀解答 隨機一題 我們把陣列 a 中符合下列屬性的任意連續子陣列 b 稱為 山脈 b.length 3 存在 0 i b.length 1 使得 b 0 b 1 b i 1 b i b i 1 b b.length 1 注意 b 可以是 a 的任意...
LeetCode 931有效的山脈陣列
給定乙個整數陣列 a,如果它是有效的山脈陣列就返回 true,否則返回 false。讓我們回顧一下,如果 a 滿足下述條件,那麼它是乙個山脈陣列 a.length 3 在 0 i a.length 1 條件下,存在 i 使得 a 0 a 1 a i 1 a i a i a i 1 a b.lengt...
LeetCode 941 有效的山脈陣列
從前往後遍歷找到第乙個遞減的位置,從後往前找到遞增的位置,最後看這兩個位置是不是一樣 線性掃瞄 按題意模擬即可。我們從陣列的最左側開始向右掃瞄,直到找到第乙個不滿足 a i a j 1 a j a j 1 a j a j 1 若都滿足就返回 true texttrue,否則返回 false text...