Cover image for 面试经典150题 P162 寻找峰值

面试经典150题 P162 寻找峰值


时间轴

时间轴

2025-12-03

init

分治

题目:

  • 如果 nums[mid] < nums[mid + 1] ⇒ 峰值一定在 右半边因为从左往右看是上升,而最右边是-∞,右半边一定有峰值(就算是单调递增,那最后一个也是峰值)。
  • 如果 nums[mid] > nums[mid + 1] ⇒ 峰值一定在 左半边因为从右向左看是上升,而最左边是-∞,左半边一定有峰值。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
#include <vector>using std::vector;class Solution {    private:        bool isPeak(vector<int> &nums, int mid)        {                int n = nums.size();                if (mid != 0 && nums[mid] <= nums[mid - 1]) {                        return false;                }                if (mid != n - 1 && nums[mid] <= nums[mid + 1]) {                        return false;                }                return true;        }    public:        int findPeakElement(vector<int> &nums)        {                int n = nums.size();                int left = 0, right = n - 1, mid;                while (left <= right) {                        mid = left + (right - left) / 2;                        if (isPeak(nums, mid)) {                                return mid;                        }                        if (nums[mid] < nums[mid + 1]) {                                // 如果 nums[mid] < nums[mid + 1] ⇒ 峰值一定在 右半边                                // 因为从左往右看是上升,而最右边是-∞,右半边一定有峰值。                                left = mid + 1;                        } else {                                // 如果 nums[mid] > nums[mid + 1] ⇒ 峰值一定在 左半边                                // 因为从右向左看是上升,而最左边是-∞,左半边一定有峰值。                                right = mid - 1;                        }                }                return mid;        }};
评论加载中…