941. Valid Mountain Array

soO_007發表於2020-12-11

題目:

Given an array of integers arr, return true if and only if it is a valid mountain array.

Recall that arr is a mountain array if and only if:

  • arr.length >= 3
  • There exists some i with 0 < i < arr.length - 1 such that:
    • arr[0] < arr[1] < ... < arr[i - 1] < A[i]
    • arr[i] > arr[i + 1] > ... > arr[arr.length - 1]

 

Example 1:

Input: arr = [2,1]
Output: false

Example 2:

Input: arr = [3,5,5]
Output: false

Example 3:

Input: arr = [0,3,2,1]
Output: true

 

Constraints:

  • 1 <= arr.length <= 10^4
  • 0 <= arr[i] <= 10^4

 

思路1:

題意是找陣列是不是一個山峰型的組,必須完整,半峰也返回false。作為一道easy題只有33%的通過率,不是很確定原因。正常思路是走一遍陣列,只要一直上升就每次更新當前最高點的index,如果中途遇到了相等,則false。如果遇到下降,break出來。這裡需要檢查是不是半峰,如果最高點index是0,說明並沒有上升,直接就下降了;如果最高點已經是陣列的最後一個,那就是一直在上升,沒有下降空間,這兩種情況都直接false。然後就從當前最高點繼續往下掃描,維持一直降的情況就好了。這是我做的比較直白的方法,思路2中介紹Lee神Lee215的邏輯上更高階的方法。

 

程式碼1:

class Solution {
public:
    bool validMountainArray(vector<int>& arr) {
        if(arr.size()<3)
            return false;
        int high=0;
        for(int i=1;i<arr.size();i++)
        {
            if(arr[i]==arr[i-1])
                return false;
            else if(arr[i]>arr[i-1])
                high=i;
            else
                break;
        }
        if(high==0||high==arr.size()-1)
            return false;
        for(int i=high+1;i<arr.size();i++)
        {
            if(arr[i]>=arr[i-1])
                return false;
        }
        return true;
    }
};

 

思路2:

用雙指標法。兩個人爬山,一個從左到右,一個從右到左,如果是一個正確的峰型,應該都是一路上升,然後在同一點即山峰遇到。最後需要檢查的是三件事:是不是在同一點遇到,左邊是不是在陣列第一位(一直降低的半峰),右邊是不是在陣列最後一位(一直增高的半峰),三點同時成立即可返回true。時間複雜度和思路1一樣都是O(n),但是個人感覺邏輯上這個更高階。

 

程式碼2:   

bool validMountainArray(vector<int>& A) {
        int n = A.size(), i = 0, j = n - 1;
        while (i + 1 < n && A[i] < A[i + 1]) i++;
        while (j > 0 && A[j - 1] > A[j]) j--;
        return i > 0 && i == j && j < n - 1;
    }

相關文章