我們把陣列 a 中符合下列屬性的任意連續子陣列 b 稱為 「山脈」:
給出乙個整數陣列 a,返回最長 「山脈」 的長度。
如果不含有 「山脈」 則返回 0。
示例 1:
輸入:[2,1,4,7,3,2,5]
輸出:5
解釋:最長的 「山脈」 是 [1,4,7,3,2],長度為 5。
示例 2:
輸入:[2,2,2]
輸出:0
解釋:不含 「山脈」。
0 <= a.length <= 10000
0 <= a[i] <= 10000
思路:
由於只能掃瞄一次,所以要判斷出哪些點不能作為山頭,而且要能區別不同的山頭(包括上坡段和下坡段),我們從頭掃瞄陣列,記錄兩個變數up和down,記錄到當前下標i時,上坡和下坡有多長。
up和down在以下兩個條件成立時會被歸為0。
a[i] == a[i + 1] or ( down > 0 && a[i] < a[i +1] )
條件的意思是如果前後兩個值相等a[i] == a[i+1],那麼不管是上坡還是下坡截止到當前第i個元素得到的up和down都是無效的,所以必須歸為0。如果當前正在下坡路段down>0
但是突然有個元素不滿足下坡時後乙個元素小於前乙個元素的特性(a[i] < a[i+1] ),那麼就證明第i個元素已經是坡底元素的下乙個元素了,不屬於這個山頭,所以up和down要歸零。
注意:在計算出所有的up以及down之後,我們就可以列舉山頂。需要注意的是,只有當 up 和 down均大於0 時,a[i] 才能作為山頂,並且山脈的長度為 up+down+1。
**:
class solution
int up = 0, down =0;
int res = 0;
for(int i = 0;i < len-1; i++)
if(a[i] < a[i+1])
if(a[i] > a[i+1])
if(up > 0 && down > 0)
}return res;
}}
845 陣列中的最長山脈
我們把陣列 a 中符合下列屬性的任意連續子陣列 b 稱為 山脈 注意 b 可以是 a 的任意子陣列,包括整個陣列 a。給出乙個整數陣列a,返回最長 山脈 的長度。如果不含有 山脈 則返回0。示例 1 輸入 2,1,4,7,3,2,5 輸出 5 解釋 最長的 山脈 是 1,4,7,3,2 長度為 5。...
845 陣列中的最長山脈
給出乙個整數陣列 a,返回最長 山脈 的長度。如果不含有 山脈 則返回 0。很容易想到暴力解法的思路,遍歷陣列,然後開始中心擴充套件,左邊需要嚴格遞減,右邊需要嚴格遞增,注意到兩邊都需要擴充套件。class solution int ans 0 for int i 1 i n 1 i 右邊擴充套件 ...
845 陣列中的最長山脈
845.陣列中的最長山脈 我們把陣列 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。給出乙個整數陣列 ...