[LeetCode] #941 Valid Mountain Array 解題
題型解說
這是一題難度為簡單的題目
需要設計一個方法,此方法會傳入一個數字陣列 arr
判斷陣列中的元素是不是由低到高再從高到低(山形)的排序,且不連續一個以上數字
比如說 [1,2,3,2] 就是一個山形陣列,但 [1,2,2,3,2] 不是,因為有兩個 2
[1,2,3,4,5] 和 [5,4,3,2,1] 也不算是山形陣列,前者只有往上沒有往下,後者相反
解題思路
準備一個數字變數(temp)和布林變數(asc),跑一次迴圈,有可能遇到如下狀況
- 某個數字與前一個數字相同,這時候直接回傳 false 即可
- 某個數字比前一個數字大,這時候確認一下 asc 變數,如果為 false 表示山峰已過,直接回傳 false
- 某個數字比前一個數字小,這時候確認一下迴圈的 index,如果是 1,代表遇到 [5,4,3,2,1] 狀況,也是回傳 false
最後只要判斷 asc 變數是不是 false 即可,如果不是 false 代表遇到 [1,2,3,4,5] 狀況
程式碼
Java
class Solution {
public boolean validMountainArray(int[] arr) {
int temp = arr[0];
boolean asc = true;
for(int i = 1, len = arr.length; i < len; i++) {
if (arr[i] == temp) {
return false;
}
if (arr[i] > temp) {
if (asc == false) {
return false;
}
temp = arr[i];
} else {
if (asc == true) {
if (i == 1) {
return false;
}
asc = false;
}
temp = arr[i];
}
}
return asc == false;
}
}
解題思路2
這是其他人的解法,更加簡潔,利用兩個 while 迴圈,第一個迴圈處理往上的情況,第二個迴圈處理往下的情況,最後判斷變數 i 是不是等於陣列長度即可
程式碼
Java
class Solution {
public boolean validMountainArray(int[] arr) {
int N = arr.length;
int i = 0;
while (i+1 < N && arr[i] < arr[i+1])
i++;
if (i == 0 || i == N-1)
return false;
while (i+1 < N && arr[i] > arr[i+1])
i++;
return i == N-1;
}
}