Description:
A peak element is an element that is greater than its neighbors.
Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.
The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.
You may imagine that num[-1] = num[n] = -∞.
For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.
本题刚看到的时候觉得比较奇怪,这不是遍历一次数组就解决了吗,不过过了一会看到题目下方有一个隐藏起来的要求:在log时间内解决这个问题。于是开始重新思考该问题。
观察题目中的数组结构,对于任意位置i,num[i] ≠ num[i+1],且只需要找到一个这样的位置返回即可。而题目又要求在对数的时间内,所以我猜想本题可以采用分治的策略去解决,带着这种思想去思考的话,可以发现这样一个现象:对于任一位置i,如果num[i] > num[i+1],那么在num[i]的左边的元素中一定存在着满足题目要求的元素,因为题目中说可以把num[-1]看做负无穷,那么如果num[i]左边的元素呈递减下降,那么第一个元素就是目标元素;而只要出现一个元素比他后一个元素小,那么这后一个元素必然满足题目要求;同理可推出,若num[i] < num[i+1],那么在num[i]右边的元素中,一定可以找到一个目标元素。根据这个现象,我们就可以通过二分的策略,逐渐把问题的规模减半,就可以达到以log时间解决该问题的目的了。
代码如下:
class Solution {
public:
int findPeakElement(vector<int>& nums) {
return search(nums, 0, nums.size() - 1);
}
int search(vector<int>& nums, int start, int end) {
if(start == end) {
return start;
}
int mid = (start + end) / 2;
if(nums[mid] > nums[mid + 1])
return search(nums, start, mid);
else
return search(nums, mid + 1, end);
}
};