• Leetcode刷题详解——山脉数组的峰顶索引


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

    2. 题目描述:

    符合下列属性的数组 arr 称为 山脉数组

    • arr.length >= 3
    • 存在i(0 < i < arr.length - 1) 使得:
      • arr[0] < arr[1] < ... arr[i-1] < arr[i]
      • arr[i] > arr[i+1] > ... > arr[arr.length - 1]

    给你由整数组成的山脉数组 arr ,返回满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i

    你必须设计并实现时间复杂度O(log(n)) 的解决方案。

    示例 1:

    输入:arr = [0,1,0]
    输出:1
    
    • 1
    • 2

    示例 2:

    输入:arr = [0,2,1,0]
    输出:1
    
    • 1
    • 2

    示例 3:

    输入:arr = [0,10,5,2]
    输出:1
    
    • 1
    • 2

    提示:

    • 3 <= arr.length <= 105
    • 0 <= arr[i] <= 106
    • 题目数据保证 arr 是一个山脉数组

    3. 解法2(暴力查找)

    3.1 算法思路

    峰顶的特点:比两侧的元素都要大

    因此我们可以遍历数组中的每一个元素,找到某一个元素比两边的元素大即可

    3.2 C++算法代码:

    class Solution {
    public:
        int peakIndexInMountainArray(vector& arr) {
            int n=arr.size();
            //遍历数组的每一个元素,直到找到峰顶元素
            for(int i=1;iarr[i-1]&&arr[i]>arr[i+1])
                return i;
            }
            return -1;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4. 解法1(二分查找)

    4.1 算法思路:

    分析峰顶位置的数据特点,以及山峰两旁的数据的特点:

    峰顶数据特点:arr[i]>arr[i-1] && arr[i]>arr[i+1]

    • 峰顶左边的数据特点:arr[i]>arr[i-1] && arr[i],也就是呈现向上的趋势
    • 峰顶右边的数据特点:arr[i]arr[i+1],也就是呈现下降的趋势

    根据mid位置的信息,我们可以分为下面三种情况:

    • 如果mid位置呈现上升趋势,说明我们接下来要在[mid+1,right]区间继续搜索
    • 如果mid位置呈现下降趋势,说明我们接下来要在[left,mid-1]区间搜索
    • 如果mid位置就是山峰,直接返回结果

    请添加图片描述

    4.2 C++算法代码:

    class Solution {
    public:
        int peakIndexInMountainArray(vector& arr) {
          //因为第一个位置和最后一个位置决对不可能是结果
          //所以左边从第二个开始,右边也从第二个开始
          int left=1,right=arr.size()-2;
          while(leftarr[mid-1]) left=mid;
              else right=mid-1;
          }
          return left;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    如何让企业微信不显示「已读」
    基于Nios-II实现流水灯
    【Jmeter】jmeter | windows安装jmeter
    初级软件测试必问面试题
    Debezium系列之:sqlserver数据库修改表结构重新设置CDC
    二、nacos注册中心配置与应用
    文件包含漏洞的详解
    robotframework+selenium+ride测试环境搭建和如何把环境迁移到不能连接互联网的环境
    Spring+Mybatis解析
    Socket网络编程
  • 原文地址:https://blog.csdn.net/weixin_51799303/article/details/134024025