寻找峰值
题目链接:寻找峰值
思路:
- 这道题的题目有点没讲明白,比如一个数组为{1,5,2,3,4}那么这里5是峰值,4属于峰值吗?
- 第一个解法就是直接遍历,遍历1——nums.length-2之间的数是否为峰值,没有峰值则返回max{nums[0],nums[nums.length-1]},相当于利用峰值的定义
public int findPeakElement(int[] nums) {
int max_index = 0;
if(nums.length==1) {
return max_index;
}else if(nums.length==2){
return nums[0]>nums[1]?0:1;
}
int i=1;
for(;i<nums.length-1;i++) {
if(nums[i]>nums[i-1]&&nums[i]>nums[i+1]) {
return i;
}
}
return nums[0]>nums[nums.length-1]?0:nums.length-1;
- 这里我提交答案发现,该题中类似于上面数组的时候,4也属于峰值,这时我们就可以利用二分法求解
- 求得数组的mid下标,将该数与mid+1上的数比较,舍弃较小的一边,直至找到最大值,返回其下标
- 这里不适用递归,定义左右两个指针,使用循环即可
public int findPeakElement(int[] nums) {
if(nums.length==1) {
return 0;
}
int left = 0,right = nums.length-1;
while(left<right) {
int mid = left+(right-left)/2;
if(nums[mid]>nums[mid+1]) {
right = mid;
}else {
left = mid+1;
}
}
return left;
}