文章目录
- 1. 题目链接
- 2. 题目大意
- 3. 示例
- 4. 解题思路
- 5. 参考代码
1. 题目链接
852. 山脉数组的峰顶索引 - 力扣(LeetCode)
2. 题目大意
描述:给定由整数组成的山脉数组 arr。
要求:返回任何满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[len(arr) - 1] 的下标 i。
说明:
- 山脉数组:满足以下属性的数组:
- len(arr)≥3;
- 存在 i(0<i<len(arr)−1),使得:
- arr[0]<arr[1]<…arr[i−1]<arr[i];
- arr[i]>arr[i+1]>…>arr[len(arr)−1]。
- 3<=arr.length<=105
- 0<=arr[i]<=106
- 题目数据保证 arr 是一个山脉数组
3. 示例
输入:arr = [0,1,0]
输出:1
输入:arr = [0,2,1,0]
输出:1
4. 解题思路
- 使用两个指针 left、right 。left 指向数组第一个元素,right 指向数组最后一个元素。
- 取区间中间节点 mid,并比较 nums[mid] 和 nums[mid+1] 的值大小。
- 如果 nums[mid]<nums[mid+1],则右侧存在峰值,令
left = mid + 1
。 - 如果 nums[mid]≥nums[mid+1],则左侧存在峰值,令
right = mid
。
- 如果 nums[mid]<nums[mid+1],则右侧存在峰值,令
- 最后,当 left==right 时,跳出循环,返回 left 。
5. 参考代码
class Solution {
public int peakIndexInMountainArray(int[] nums) {
int l = 0, r = nums.length - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (nums[mid] < nums[mid + 1]) {
l = mid + 1;
} else {
r = mid;
}
}
return l;
}
}