leetcode峰值问题
leetcode峰值问题
题目链接:![https://leetcode.cn/problems/find-peak-element/description/]
解题思路
这题可以使用二分法作答。虽然数组不是有序的,但是用二分法同样可以做。
代码如下:
class Solution {
public:int findPeakElement(vector<int>& nums) {if (nums.size() == 1)return 0;int mid, left, right;int length = nums.size();if (nums[0] > nums[1])return 0;else if (nums[nums.size() - 1] > nums[nums.size() - 2])return (length - 1);else // 此时说明0位置上扬,末尾置下降{left = 0;right = length - 1;mid = left + (right - left) / 2;while (left <= right) {if (nums[mid] > nums[mid + 1] && nums[mid] > nums[mid - 1])return mid;else if (nums[mid] < nums[mid + 1]) // 往后二分{left = mid + 1;mid = left + (right - left) / 2;} else if (nums[mid] < nums[mid - 1]) // 往前二分{right = mid - 1;mid = left + (right - left) / 2;}}}return -1;}
};
我们首先判断首尾是不是峰值,如果首尾皆不是峰值,那么峰值一定在中间(大家可以画图理解一下:开头是上升的,末尾是下降的)。计算得到中间位置,判断是否为峰值。如果不是,若中间位置左边是下降的,往左边二分;若中间位置右侧是上升的,往右侧二分。重复直到找到峰值或到达临界条件为止。