LeetCode 162. Find Peak Element?
public int findPeakElement(int[] nums)
The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.
You may imagine that nums[-1] = nums[n] = -∞.
也就是说 如果这个元素在边上 那么就只是比下一个或者上一个元素高就行了
如果在中间 就要比左右的都要高。
这个题目看上去跟二分有什么关系呢?
仔细审一审题目,我们就是说要找三个相邻元素/两个相邻元素 使得中间的元素比两边的元素要大。但是怎么样要找到这个元素pair呢?()
(下面是答案 但是具体为什么这样做不太明白)
class Solution {
public int findPeakElement(int[] nums) {
int start = 0;
int end = nums.length - 1;
while (start + 1 < end) { //这个模板 属实看见很多次了
int mid = (end - start) / 2 + start;
if (nums[mid] > nums[mid + 1]) { //之前想的是三个数 mid mid-1 mid+1之间的比较 但是现在看来 只需要两个就可以 像这种情况 mid前面显然更可能是peak
end = mid;//降低右边界
} else { //否则
start = mid + 1;//提升左边界
}
}//如果start end邻居或者直接相遇
if (nums[start] > nums[end]) return start;//如果start>end 那么就直接返回start
return end;//否则返回end
}
}

浙公网安备 33010602011771号