首页 > 其他分享 >力扣-852. 山脉数组的峰顶索引

力扣-852. 山脉数组的峰顶索引

时间:2024-04-30 09:12:14浏览次数:27  
标签:arr right 峰顶 852 复杂度 mid 力扣 数组 left

1. 题目

题目地址(852. 山脉数组的峰顶索引 - 力扣(LeetCode))

https://leetcode.cn/problems/peak-index-in-a-mountain-array/?envType=study-plan-v2&envId=primers-list

题目描述

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

  • arr.length >= 3
  • 存在 i0 < 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

示例 2:

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

示例 3:

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

 

提示:

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

2. 题解

2.1 二分法

思路

由于题目要求时间复杂度为O(logn), 所以采用二分法
关于二分法详情参考:二分查找

代码

  • 语言支持:C++

C++ Code:


class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        int n = arr.size();
        
        // 左闭右闭 [1, n - 2]
        // int left = 1, right = n - 2, ans = 0; // 因为是山脉数组, 必然两头 0和 n-1 是不可能的, 要找的话往中间找[1, n-2] / [1, n - 1)
        // while(left <= right){    
        //     int mid = (left + right) / 2;   
        //     if(arr[mid] > arr[mid+1]){
        //         right = mid - 1;
        //     } else{
        //         left = mid + 1;
        //     }
        // }

        
        // 左闭右开 [1, n - 1)
        // [left, right) -> [left, mid) / [mid+1, right) , 结束[left, left)
        // 这里即使[left, mid) 中的 mid是最后一个也没关系, 必然会走 left = mid新(=mid旧-1) + 1,
        int left = 1, right = n - 1, ans = 0;
        while(left < right){
            int mid = (left + right) / 2;   
            if(arr[mid] > arr[mid+1]){
                right = mid;
            } else{
                left = mid + 1;
            }
        }
        return left;

    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(logn)\)
  • 空间复杂度:\(O(1)\)

标签:arr,right,峰顶,852,复杂度,mid,力扣,数组,left
From: https://www.cnblogs.com/trmbh12/p/18167024

相关文章

  • 力扣-258. 各位相加
    1.题目题目地址(258.各位相加-力扣(LeetCode))https://leetcode.cn/problems/add-digits/?envType=study-plan-v2&envId=primers-list题目描述给定一个非负整数num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。 示例1:输入:num=38输出:2解释:各位......
  • 力扣-2586. 统计范围内的元音字符串数
    1.题目题目地址(2586.统计范围内的元音字符串数-力扣(LeetCode))https://leetcode.cn/problems/count-the-number-of-vowel-strings-in-range/?envType=study-plan-v2&envId=primers-list题目描述给你一个下标从0开始的字符串数组words和两个整数:left和right。如果字......
  • 力扣-1422. 分割字符串的最大得分
    1.题目题目地址(1422.分割字符串的最大得分-力扣(LeetCode))https://leetcode.cn/problems/maximum-score-after-splitting-a-string/?envType=study-plan-v2&envId=primers-list题目描述给你一个由若干0和1组成的字符串s,请你计算并返回将该字符串分割成两个非空子......
  • leetcode(力扣) 2866. 美丽塔 II
    原题链接暴力做法(时间复杂度O(n^2))每次选取下标i为峰值,进行n次,对每次取max就可以找打答案对于i左边的序列:需要满足序列是非递减的,同时每个值尽可能大所以满足:下标为j的位置上的数<=下标是(j,i]的最小的值(等于时取得最大值),同时需要保证j位......
  • 力扣-231. 2 的幂
    1.题目题目地址(231.2的幂-力扣(LeetCode))https://leetcode.cn/problems/power-of-two/?envType=study-plan-v2&envId=primers-list题目描述给你一个整数n,请你判断该整数是否是2的幂次方。如果是,返回true;否则,返回false。如果存在一个整数x使得 n==2x,则认为......
  • 力扣-709. 转换成小写字母
    1.题目题目地址(-力扣(LeetCode))https://leetcode.cn/problems/to-lower-case/?envType=study-plan-v2&envId=primers-list题目描述给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 示例1:输入:s="Hello"输出:"hello"示例2:输入:s="......
  • 力扣-1979. 找出数组的最大公约数
    1.题目介绍题目地址(c-力扣(LeetCode))https://leetcode.cn/problems/find-greatest-common-divisor-of-array/题目描述给你一个整数数组nums,返回数组中最大数和最小数的最大公约数。两个数的 最大公约数是能够被两个数整除的最大正整数。 示例1:输入:nums=[2,5,6......
  • 力扣-566. 重塑矩阵
    1.题目题目地址(566.重塑矩阵-力扣(LeetCode))https://leetcode.cn/problems/reshape-the-matrix/题目描述在MATLAB中,有一个非常有用的函数reshape,它可以将一个 mxn矩阵重塑为另一个大小不同(rxc)的新矩阵,但保留其原始数据。给你一个由二维数组mat表示的 mxn......
  • 力扣-125. 验证回文串
    1.题目题目地址(125.验证回文串-力扣(LeetCode))https://leetcode.cn/problems/valid-palindrome/题目描述如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串。字母和数字都属于字母数字字符。......
  • 力扣练习-动态规划
    线性DP3122.使矩阵满足条件的最少操作次数classSolution{/*问题分类:线性DP问题1.每一列元素值相同,相邻列元素值不同,考虑按照列进行状态枚举枚举2.0<=grid[i][j]<=9,值的范围很小只有10个3.f[i][j]可以为考虑前i列并且第i列元素为......