leetcode 二分查找·系统掌握 山峰数组的峰顶索引

题目:

题解:

一种可行的方法是用一个普通的二分查找即可:每次取一个数索引为x同时可以得到索引为x+1和x-1的数,如果在山峰之前索引为x+1的数是这相邻的三个数中最大的调整l=mid,如果在山峰之后索引为x-1的值是这三个相邻的数中最大的调整r=mid,如果索引为x的数刚好是相邻三数中最大的即找到答案。

int peakIndexInMountainArray(vector<int>& arr) {
        int l=0,r=arr.size()-1,mid;
        while(l<=r){
            mid=(l+r)>>1;
            if(mid-1>=0&&mid+1<arr.size()&&arr[mid]==max({arr[mid],arr[mid-1],arr[mid+1]}))return mid;
            else if(mid-1>=0&&mid+1<arr.size()&&arr[mid+1]==max({arr[mid],arr[mid-1],arr[mid+1]}))l=mid;
            else r=mid;
        }
        return -1;
    }

题后反思:

本道题在更新二分查找左右端点时,不可以只用r=mid-1,l=mid+1,而要在需要更新时的写法是:

r=mid,l=mid,因为山峰纯在于严格的相邻三数中,这样写能保证每次都够取出相邻的三个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值