模块三:二分——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 位置就是⼭峰,直接返回结果。

代码实现

暴力查找

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++

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

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;
    }
}

相关推荐

  1. 「优选算法」:山脉峰顶索引

    2024-04-25 10:14:03       49 阅读
  2. LeetCode 0410.分割最大值:

    2024-04-25 10:14:03       55 阅读
  3. 面试算法69:山峰顶部

    2024-04-25 10:14:03       55 阅读
  4. Leetcode724.寻找中心索引

    2024-04-25 10:14:03       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 10:14:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 10:14:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 10:14:03       87 阅读
  4. Python语言-面向对象

    2024-04-25 10:14:03       96 阅读

热门阅读

  1. 【c/c++】cpp对c的增强 delete 和 delete []的区别

    2024-04-25 10:14:03       32 阅读
  2. Edge的使用心得与深度探索

    2024-04-25 10:14:03       37 阅读
  3. tomcat到底是干嘛的?

    2024-04-25 10:14:03       33 阅读
  4. SpringBoot集成JPA及基本使用

    2024-04-25 10:14:03       37 阅读
  5. 直接扩频通信系统的Matlab实现

    2024-04-25 10:14:03       35 阅读
  6. pandas数据分析综合练习50题 - 地区房价分析

    2024-04-25 10:14:03       104 阅读
  7. NLP(7)--Embedding、池化、丢弃层

    2024-04-25 10:14:03       77 阅读
  8. 检查现有的remote repo 并换新的remote repo

    2024-04-25 10:14:03       84 阅读
  9. npm详解:Node.js的包管理器

    2024-04-25 10:14:03       38 阅读