【力扣】162. 寻找峰值

该文介绍了如何使用二分查找算法在O(logn)的时间复杂度内找到整数数组中的峰值元素,即值大于左右相邻值的元素。文中通过举例说明了二分查找过程中可能遇到的三种情况,并提供了相应的代码实现。

这里写目录标题

题目

峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

示例

输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2
输入:nums = [1,2,1,3,5,6,4]
输出:15 
解释:你的函数可以返回索引 1,其峰值元素为 2;
     或者返回索引 5, 其峰值元素为 6

题解

我们在数组中随便找一个值,此时有三种可能
1,nums[mid] > nums[mid + 1] && nums[mid] > nums[mid - 1]
符合题意 直接return出去。
2,nums[mid] < nums[mid + 1].。
此时可以肯定的是峰值肯定在 mid 的右边
3,num[mid] < nums[mid - 1]
此时可以肯定峰值肯定在 mid 的左边
为什么二三这么肯定呢?
大家可以想一想,nums[mid]肯定不是封顶了,比如第二种情况nums[mid + 1]就比它大了,那么
为什么说峰顶一定在右边呢?因为题意说边界是-∞,最坏的情况不就是右边一个比一个大直到边界那个肯定是峰顶。最好的情况就是nums[mid + 1]就比它右边那个大了,也就是峰顶了。

整体代码

    public int findPeakElement(int[] nums) {
        int left = 0,right = nums.length - 1;
        if (nums.length == 1){
            return 0;
        }
        while (left <= right){
            int mid = left + ((right - left) >> 2);
            if (mid == 0){
                if (nums[mid] > nums[mid + 1]){
                    return mid;
                }
            }else if (mid == nums.length - 1){
                if (nums[mid] > nums[mid - 1]){
                    return mid;
                }
            }else {
                if (nums[mid] > nums[mid + 1] && nums[mid] > nums[mid - 1]){
                    return mid;
                }
            }
            if (nums[mid] < nums[mid + 1]){
                left = mid + 1;
            }else {
                right = mid - 1;
            }
        }
        return -1;

    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值