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

文章目录

题目描述

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

算法原理

解法一:暴力查找

峰顶:比左右区间都大

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

解法二:二分查找

  1. 分析峰顶位置的数据特点,以及⼭峰两旁的数据的特点:
  • 峰顶数据特点: arri > arri - 1 && arri > arri + 1
  • 峰顶左边的数据特点: arri > arri - 1 && arri < arri + 1 ,也就是呈现上升趋势;
  • 峰顶右边数据的特点:arri < arri - 1 && arri > arri + 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;
    }
}
相关推荐
wabs6669 分钟前
关于哈希表【力扣15.三数之和的思考】
数据结构·算法·leetcode·散列表·哈希表·三数之和
欧特克_Glodon14 分钟前
OpenCV计算机视觉开发入门与实践<二>:图像噪声与图像处理
c++·图像处理·opencv·计算机视觉
退休倒计时15 分钟前
【每日一题】LeetCode 88. 合并两个有序数组 TypeScript
算法·leetcode·职场和发展·typescript
键盘会跳舞21 分钟前
C++:函数对象与 std::function 源码级深度拆解——泛型算法的策略内核与可调用对象统一封装
c++·算法·仿函数
手写码匠26 分钟前
华为云Flexus+DeepSeek征文|Agent 评测体系实战:用 DeepSeek-R1 当裁判,打造 Dify Agent 的自动化回归测试流水线
人工智能·深度学习·算法·aigc
LONGZETECH37 分钟前
无人机实训高成本痛点解法:虚拟仿真实现 70% 耗材损耗下降
大数据·算法·unity·架构·无人机
不会就选b41 分钟前
算法日常・每日刷题--<队列,宽搜>4
算法
Augustzero1 小时前
为什么高性能调度器都在“偷任务”?从无锁队列看懂工作窃取
c++·后端
(Charon)1 小时前
【C++】线程安全队列(三):MPSC无锁队列、atomic与链表节点实现
c++·安全·链表
(Charon)1 小时前
【C++】:使用 mutex + deque 实现一个简单的 LockedQueue
开发语言·c++