思路: binary search。其实这题很简单的,我觉得是题目没有说清楚。如果全是上升或是下降的情况,这两种情况也是有答案的,返回最大值即可,即是peek。我一开始以为这两种情况是不存在解的,搞得我纠结了半天。我的答案是分成四种情况来讨论的,标答并没有我那么复杂,但是我觉得我这样写可读性更高。下面展示代码:
class Solution {
public int findPeakElement(int[] nums) {
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
//下面两个是base case
if(right - left == 1) return nums[left] > nums[right] ? left : right;
if(left == mid && mid == right) return mid;
//下面四个就是我所说的我分的四种情况
if(nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) return mid; //标准情况
else if(nums[mid] > nums[mid - 1] && nums[mid] < nums[mid + 1]) left = mid + 1;
else if(nums[mid] < nums[mid - 1] && nums[mid] > nums[mid + 1]) right = mid - 1;
else{
//return findPeakElement(Arrays.copyOfRange(nums,left,mid + 1));
right = mid; // 或者这边也可以 left = mid,因为题目中说了只找出其中一个peek就可以了
}
}
return 100;
}
}
总结:
- 子array : Arrays.copyOfRange(arr, int beg, int end) 注意end是开区间。