LeetCode刷题852

  1. 山脉数组的峰顶索引
    题目:符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
    arr[0] < arr[1] < ... arr[i-1] < arr[i]
    arr[i] > arr[i+1] > ... > arr[arr.length - 1]

示例 1:
输入:arr = [0,1,0]
输出:1

提示:
3 <= arr.length <= 10^4
0 <= arr[i] <= 10^6
题目数据保证 arr 是一个山脉数组

给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] 的下标 i 。

         题目就是想让我们找到最大数的下标咱们用二分来解决这个问题。
要用二分但没有明确要查找的数 但是呢这个数组比较特殊 左边递增右边递减,我们可以利用这个特点来进行寻找。
        根据题意我们可以得知该数组一定是一个山脉数组也就是说没有重复且一定符和递增递减的特点。所以不用考虑数组值重复或长度为0的情况。
        这虽然不是一个连续的递增,但任然可以按照二分思路解决,我们还是来取中间值mid来比较,到比较对象变了,让他跟mid-1和mid+1比较
if [mid-1]<[mid]
left=mid;
if [mid+1]>[mid]
right=mid;

结束条件就是 当 [mid]>[mid-1] && [mid]>[mid-1]

可以认为[left,right]是一个有效区间通过 不断缩小最终找出最大值的下标

class Solution {
    public int peakIndexInMountainArray(int[] arr) {
         int left=0;
         int right=arr.length-1;
         while(left<=right){
            int mid=(left+right)/2;
            if(arr[mid]>arr[mid-1] && arr[mid]>arr[mid+1]){
                return mid;
            }
             if(arr[mid]<arr[mid-1]){
                 right=mid;
             }
            if(arr[mid]<arr[mid+1]){
                 left=mid;
             }
         }
         return -1;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值