力扣 有效的山脈陣列思路分析

2021-10-08 04:00:38 字數 1829 閱讀 2740

題目描述:

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

示例 1:

輸入:[2,1]

輸出:false

示例 2:

輸入:[3,5,5]

輸出:false

示例 3:

輸入:[0,3,2,1]

輸出:true

0 <= a.length <= 10000

0 <= a[i] <= 10000

解題思路1:對於這個問題,最先想到的應該是三個步驟,首先根據山脈陣列的描述,我們肯定要對於陣列長度小於三的陣列直接排除,其次找到陣列中的最大值的位置,然後判斷這個位置是否處於臨界位置,若是則返回false,否則對它的左右兩邊依次進行比較,若符合題目描述則給出判斷。

所遇問題1:這個思路在提交的時候被卡住了很多次,先是沒有思考到最大值在兩端的邊界問題,其次沒有考慮到像[3,5,5]這樣的特殊測試值。

public

boolean

validmountainarray

(int

a)//當長度大於三時的情況

else

if(a[i]

> max)

}//最大值的臨界問題判斷

if(flag ==0)

else

if(flag == a.length-1)

else

for(

int i = a.length-

2; i > flag; i--)}

return

true;}

}

解題思路2:第一種題解方法,時間和空間都只達到了百分之五十左右,所以我就思考能不能繼續改善我的方法,這次我不再先尋找最大值,我直接判斷完陣列長度後,從頭開始遍歷陣列,一旦遇到當前值小於陣列前一位值時可假設已經達到山頭,開始下山,所以繼續開始迴圈。這樣減去了找最大值所用的時間,我想效率應該會有所提高。

所遇問題2:經過測試,效率和第一次差不多,基本沒有什麼改變,所以優化失敗。

public

boolean

validmountainarray

(int

a)//當長度大於三時的情況

else

i++;for

(;i < a.length;i++)}

return

true;}

}

class

solution

}

**理解:作者的方法是從陣列的最左側開始掃瞄,直到找到第乙個不滿足 a[i] < a[i + 1] 的 i,那麼 i 就是這個陣列的最高點。如果 i = 0 或者不存在這樣的 i(即整個陣列都是單調遞增的),那麼就返回 false。否則從 i 開始繼續掃瞄,判斷接下來的的位置 j 是否都滿足 a[j] > a[j + 1],若都滿足就返回 true,否則返回 false。其實作者的線性掃瞄法和我的方法本質 上是相同的,只是作者將它的**超級簡練化。

力扣 941 有效的山脈陣列

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

力扣每日一題 有效的山脈陣列

給定乙個整數陣列 a,如果它是有效的山脈陣列就返回 true,否則返回 false。讓我們回顧一下,如果 a 滿足下述條件,那麼它是乙個山脈陣列 a.length 3 在 0 i a.length 1 條件下,存在 i 使得 示例 1 輸入 2,1 輸出 false 示例 2 輸入 3,5,5 輸出...

有效的山脈陣列

leetcode的一道演算法題 給定乙個整數陣列 a,如果它是有效的山脈陣列就返回 true,否則返回 false。讓我們回顧一下,如果 a 滿足下述條件,那麼它是乙個山脈陣列 a.length 3 在 0 i a.length 1 條件下,存在 i 使得 a 0 a 1 a i 1 a i a i...