LeetCode 852 山脉数组的峰顶索引[二分法] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 852 山脉数组的峰顶索引[二分法] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
首先浮现于脑海的思路就是暴力遍历,根据题意,就是找到最大值的下标即可,那么遍历一遍返回最大值的下标,代码如下:
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int index = 0, maxNum = arr[0];
for(int i = 1 ; i < arr.size(); i ++) {
if(arr[i] > maxNum) {
maxNum = arr[i];
index = i;
}
}
return index;
}
};
但是效率肯定惨不忍睹,还有一种方法是回归题意本身,也就是找到第一个左边比右边大的位置,就是山峰位置,返回即可,代码如下:
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int i;
for(i = 0 ; i < arr.size() - 1; i ++) {
if(arr[i] > arr[i + 1]) {
return i;
}
}
// 其实这里没什么用
return i;
}
};
为了达到O(logn)的复杂度,二分法是必不可少的,如果中间值左边比右边小那么该数在峰左边,否则在峰的右边,一直到左右相遇,就是峰顶的位置,代码如下:
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
// 定义左右边界,注意right要是长度减2,不然mid + 1 可能越界
int left = 0, right = arr.size() - 2;
while(left < right) {
// 中间位置
int mid = (left + right) / 2;
// 左边比右边小在峰左边,否则在峰的右边
if(arr[mid] < arr[mid + 1]) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
};
以上是关于LeetCode 852 山脉数组的峰顶索引[二分法] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
JS Leetcode 852. 山脉数组的峰顶索引图解分析,高高的山峰一起吹山风吧。