力扣 每日一题 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时即是答案)。
浙公网安备 33010602011771号