时间轴
时间轴
2025-12-03
init
分治
题目:
- 如果 nums[mid] < nums[mid + 1] ⇒ 峰值一定在 右半边因为从左往右看是上升,而最右边是-∞,右半边一定有峰值(就算是单调递增,那最后一个也是峰值)。
- 如果 nums[mid] > nums[mid + 1] ⇒ 峰值一定在 左半边因为从右向左看是上升,而最左边是-∞,左半边一定有峰值。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | 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; }}; |
