Skip to content

Latest commit

 

History

History
30 lines (28 loc) · 1.16 KB

162. Find Peak Element.md

File metadata and controls

30 lines (28 loc) · 1.16 KB

思路

寻找一个数组中的极大值. 由于要求对数复杂度, 所以我们很容易想到二分法. 由于题目说了nums[-1]和nums[n]为负无穷, 那么极大值一定存在(想象一下被山谷包围的山脉).

那么在二分的循环中:

  1. mid == 0 || nums[mid-1] < nums[mid], 即mid左边是上升趋势, 那么mid或者其右边一定存在极大值;
  2. 满足1且mid == n - 1 || nums[mid] > nums[mid+1], 即mid就是极大值;
  3. 满足1但不满足2, 那么其右边一定存在极大值, 此时更新low = mid + 1;
  4. 否则, mid左边一定存在极大值, 此时更新high = mid - 1;

C++

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int n = nums.size();
        int low = 0, high = n - 1, mid;
        while(low < high){
            mid = low + (high - low) / 2;
            if(mid == 0 || nums[mid-1] < nums[mid]){
                if(mid == n - 1 || nums[mid] > nums[mid+1]) return mid; // 找到
                else low = mid + 1;
            }
            else high = mid - 1;
        }
        return low;
    }
};