模块三:二分——852.山脉数组的峰顶索引

文章目录

题目描述

题目链接:852.山脉数组的峰顶索引

算法原理

解法一:暴力查找

峰顶:比左右区间都大

遍历整个数组,寻找数组内符合这个条件的元素即可。

解法二:二分查找

  1. 分析峰顶位置的数据特点,以及⼭峰两旁的数据的特点:
  • 峰顶数据特点: arr[i] > arr[i - 1] && arr[i] > arr[i + 1] ;
  • 峰顶左边的数据特点: arr[i] > arr[i - 1] && arr[i] < arr[i + 1] ,也就是呈现上升趋势;
  • 峰顶右边数据的特点:arr[i] < arr[i - 1] && arr[i] > arr[i + 1] ,也就是呈现下降趋势。
  1. 因此,根据 mid 位置的信息,我们可以分为下⾯三种情况:
  • 如果 mid 位置呈现上升趋势,说明我们接下来要在 [mid + 1, right] 区间继续搜索;
  • 如果 mid位置呈现下降趋势,说明我们接下来要在 [left, mid - 1] 区间搜索;
  • 如果 mid 位置就是⼭峰,直接返回结果。

代码实现

暴力查找

cpp 复制代码
class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        int n = arr.size();
        // 遍历数组内每⼀个元素,直到找到峰顶
        for (int i = 1; i < n - 1; i++)
            // 峰顶满⾜的条件
            if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1])
                return i;
        // 为了处理 oj 需要控制所有路径都有返回值
        return -1;
    }
};

二分------C++

cpp 复制代码
class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        //二段性使用二分
        int left = 1,right = arr.size() - 2;
        while(left < right){
            int mid = left + (right - left + 1) / 2;
            if(arr[mid] >= arr[mid - 1])left = mid;
            else right = mid - 1;
        }
        return left;
    }
};

二分------Java

java 复制代码
class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int left = 1, right = arr.length - 2;
        while (left < right) {
            int mid = left + (right - left + 1) / 2;
            if (arr[mid] > arr[mid - 1])
                left = mid;
            else
                right = mid - 1;
        }
        return left;
    }
}
相关推荐
承渊政道几秒前
C++学习之旅【实战全面解析C++类和对象】
c++·笔记·学习
懂AI的老郑4 分钟前
深入理解C++中的堆栈:从数据结构到应用实践
java·数据结构·c++
胡萝卜3.05 分钟前
现代C++特性深度探索:模板扩展、类增强、STL更新与Lambda表达式
服务器·开发语言·前端·c++·人工智能·lambda·移动构造和移动赋值
智算菩萨6 分钟前
音乐生成模型综述:从符号作曲到音频域大模型、评测体系与产业化趋势
人工智能·深度学习·算法
晚风(●•σ )8 分钟前
C++语言程序设计——12 排序算法-桶排序
c++·算法·排序算法
kgduu8 分钟前
Gin源码解析
算法·gin
淀粉肠kk10 分钟前
【数据结构】哈希表
数据结构·c++
郝学胜-神的一滴12 分钟前
Linux C++会话编程:从基础到实践
linux·运维·服务器·开发语言·c++·程序人生·性能优化
AA陈超12 分钟前
LyraStarterGame_5.6 Experience系统分析
开发语言·c++·笔记·学习·ue5·lyra
历程里程碑19 分钟前
C++ 8:list容器详解与实战指南
c语言·开发语言·数据库·c++·windows·笔记·list