[LeetCode] 852. Peak Index in a Mountain Array 山形數組的頂峯座標



Let's call an array A a mountain if the following properties hold:html

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

Given an array that is definitely a mountain, return any i such that A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1].git

Example 1:github

Input: [0,1,0]
Output: 1

Example 2:數組

Input: [0,2,1,0]
Output: 1

Note:函數

  1. 3 <= A.length <= 10000
  2. 0 <= A[i] <= 10^6
  3. A is a mountain, as defined above.



這道題定義了一種山形的數組,說是有一個最高點,而後向兩邊各自下降,讓咱們找出山峯的位置。其實這道題跟以前那道 Find Peak Element 很是的相似,只不過那道題有不少局部峯值,而這裏道題只有一個全局峯值。題目中限定了山峯必定存在,即必定有一個最高點,反應在數組中就是最大值,那麼問題就轉換爲了求數組中最大值的位置,最簡單直接的方法就是遍歷數組找出最大值的位置便可,這裏使用了 STL 的內置函數 max_element() 來一行解題,參見代碼以下:code


解法一:htm

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& A) {
        return max_element(A.begin(), A.end()) - A.begin();
    }
};



因爲題目中限定了山峯必定存在,因此咱們也能夠直接直接來找第一個降低的位置,即 A[i] > A[i+1] 的地方,那麼i位置必定就是山峯了,注意i的遍歷範圍要去掉首尾兩個數字,參見代碼以下:blog



解法二:element

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& A) {
        for (int i = 1; i < (int)A.size() - 1; ++i) {
            if (A[i] > A[i + 1]) return i;
        }
        return 0;
    }
};



上面兩種解法都是線性的時間複雜度,能不能更快一點呢?那麼就只有使用二分搜索法來加快搜索速度了,其實這是博主的總結帖 LeetCode Binary Search Summary 二分搜索法小結 中的第五類狀況,跟前的稍有不一樣的是 right 的初始化,以前的狀況博主基本上都是用數組長度初始化 right 的,可是這裏要用數組長度減1來初始化 right,由於要跟緊鄰的右邊的數字比較,這樣初始化 right 的意義在於 mid+1 就不會越界了,參見代碼以下:leetcode



解法三:

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& A) {
        int n = A.size(), left = 0, right = n - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (A[mid] < A[mid + 1]) left = mid + 1;
            else right = mid;
        }
        return right;
    }
};



Github 同步地址:

https://github.com/grandyang/leetcode/issues/852



相似題目:

Find Peak Element



參考資料:

https://leetcode.com/problems/peak-index-in-a-mountain-array/

https://leetcode.com/problems/peak-index-in-a-mountain-array/discuss/139848/C%2B%2BJavaPython-Better-than-Binary-Search


LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索