題目描述:
給定乙個整數陣列 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...