BM19 寻找峰值(java版本)
题目:
思路:
1、数组两边界是负无穷,看成最小
2、用二分法取中间位置m的数,往一定有峰的方向走,怎么确定哪个方向一定有峰呢?
1)如果m中点右边趋势往下,右半部分不一定有峰,舍弃右半部分。为什么左边一定有峰?左半部分从下标m开始往左看 一是先上再下有峰;二是一直向上,而左边界是负无穷,有峰;
2)如果m中点右边趋势往上,右半部分一定有峰,舍弃左半部分。为什么左边一定有峰?一是 m中点向上之后可能会向下,有峰;二是一直向上,而右边界是负无穷,有峰。
3、最终l=r,左右两点相遇就是峰值
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int findPeakElement (int[] nums) {
// write code here
int l=0;
int r=nums.length-1;
//数组两边界是负无穷,看成最小
while(l<r){//l=r不用进来了,说明相遇了,该点就是峰
int m=l+ (r-l)/2;
if(nums[m]>nums[m+1]){
//右边趋势往下,不一定有峰,所以舍弃右半部分,缩小r,
//且m本身可能是峰,所以是r=m,不是r=m-1;
r=m;
}else if(nums[m]<nums[m+1]){
//右边趋势往上,一定有峰,且不可能是m,舍弃左半部分,所以l=m+1
l=m+1;
}
}
return r;
}
}
版权声明:本文为weixin_45429720原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。