leetcode 山脈問題

2021-10-10 04:56:09 字數 2051 閱讀 2219

給定乙個整數陣列 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...