leetcode 852. 山脉数组的峰顶索引(优质解法)

代码:

class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int left=0,right=arr.length-1;
        while (left<right){
            int mid=left+(right-left+1)/2;
            
            if(arr[mid]>arr[mid-1]){
                left=mid;
            }else {
                right=mid-1;
            }
        }
        
        return left;
    }
}

题解:

        简单分析一下题目的要求,首先题目给出的信息有:

        1.山脉数组的长度 > = 3,代表每一组数组必定存在一个顶点

        2. 山脉数组由整数组成

        3.我们要找到满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i

        所以数组就呈现如下的结构:

        比如数组 arr =[1,2,3,2,1] 时,我们要找的顶点就是 3 ,下标为 2

        我们对上述的数组进行分析,我们可以将数组划分为两个区间【1,2,3】是递增区间,【2,1】是递减区间,在图中的划分就是

        通过该划分,我们要找的数据就是递增区间中的右边界,当我们在数组中随机选择一个数   arr[ i ] , 如果 arr[ i ] > arr[ i-1 ] ,就代表该数在递增区间,我们便可以大胆排除该数左边的数据(但不能排除该数,因为我们想获得的答案就在递增区间中,我们不能确定该数是否刚好就是我们想要的答案)

        如果 arr[ i ] < arr[ i-1 ] ,就代表该数在递减区间,我们便可以大胆排除该数以及该数右边的数据   

        通过上述分析,我们便知道该题具有二段性,所以我们可以用二分法来解决该问题

同样是  arr =[1,2,3,2,1] 的例子

        将 L 和 R 指针指向左右边界,计算 mid = L +(R- L+1)/2 = 3 ,因为 arr[ mid ] > arr[ mid -1 ],所以 mid 指向的值在递增区间,让 L = mid

1        2        3        2        1

L                 mid                R

        计算 mid = 3,此时 arr[ mid ] < arr[ mid -1 ],所以 mid 指向的值在递减区间,让 R = mid -1

1        2        3        2        1

                    L       mid     R

        当 L 和 R 指针相遇时代表找到了符合条件的值,返回 L 指针指向的位置即可

1        2        3        2        1

                    L 

                    R

         

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小林想被监督学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值