LeetCode 852.山脉数组的峰顶索引

1、题目描述

给定一个长度为 n 的整数 山脉 数组 arr ,其中的值递增到一个 峰值元素 然后递减。

返回峰值元素的下标。

你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。

2、算法思路

方法一、暴力法 

        遍历数组,当遍历到的这个数一直和上一个数比较,如果arr[i]>arr[i-1] 就一直遍历下去,找到一个arr[i-1]> arr[i] 的数,然后返回 i-1

方法二、二分法

         根据题目可以知道[left,mid]是递增,[mid,right]是递减,注意是不存在连续2个相等的数

(1)、判断条件

if (arr[mid] > arr[mid-1]) left=mid;

 else if(arr[mid] < arr[mid-1])right = mid -1;

(2)、循环条件

while(left < right)不能<=,因为会进入死循环。当left-right = 1时,left=mid,还是if (arr[mid] > arr[mid-1]) left=mid;这个条件成立 就会不断的进入死循环,所以不能加=。

(3)取中点

mid = (left+right ) >>>1;和 mid = (left+right +1) >>>1;

(1)比如left=2,right=3,mid=2,如果是mid = (left+right ) >>>1时,mid=2,此时还是if (arr[mid] > arr[mid-1]) left=mid;条件成立,此时left=2,right=3,mid=2,while(left < right)成立进入死循环

(2)比如left=2,right=3,mid=2,如果是mid = (left+right +1) >>>1时,mid=3,此时还是if (arr[mid] > arr[mid-1]) left=mid;条件成立,此时left=3,right=3,mid=3,while(left < right)不成立,结束循环

3、算法代码

class Solution {
   public static int peakIndexInMountainArray(int[] arr) {
        //[0,mid]是递增,[mid,right]是递减,所以就返回mid
        int left = 0,right = arr.length-1;
        while (left < right){
            int mid = (left + right +1) >>>1;
            if (arr[mid] > arr[mid-1]) left=mid;
            else if(arr[mid] < arr[mid-1])right = mid -1;
        }
        return left;
    }
}

4、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值