力扣 每日一题 852. 山脉数组的峰顶索引

今天又是个简单题,重拳出击,这个面试的时候遇到过,用二分查找。

符合下列属性的数组 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]
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。

示例 :

输入:arr = [24,69,100,99,79,78,67,36,26,19]
输出:2
用二分来确定左右区间,如果arr[mid]<arr[end],说明目标在右边,则start = mid+1,若arr[mid]<arr[start],说明目标在左边,否则,start++,end--,缩小区间,然后返回end。这里为什么返回end,因为我返回start答案错误,返回end试试,结果正确了。
以下是代码。
 1 public int peakIndexInMountainArray(int[] arr) {
 2         int start = 0;
 3         int end = arr.length - 1;
 4         while (start < end) {
 5             int mid = start + (end - start) / 2;
 6             if (arr[mid] < arr[start]) {
 7                 end = mid - 1;
 8             } else if (arr[mid] < arr[end]) {
 9                 start = mid + 1;
10             } else {
11                 start++;
12                 end--;
13             }
14         }
15         return end;
16     }

用二分的时候,都会有疑问,什么时候用<=,什么时候用<。我一般都是试试,没有仔细研究,今天看了看评论,这里引用一下,还没验证过,回头有机会验证一下。

这是来自力扣的评论区:个人理解,如果要求数组下标,又不想开新的变量保存答案,那么就用<(因为当l==r时即是答案)。

 

posted on 2021-06-15 11:05  jejas  阅读(56)  评论(0)    收藏  举报