【手把手带你刷LeetCode】——07.寻找峰值

简介: 寻找峰值

【前言】

今天是力扣打卡第7天!

好快呀,一周已经过去了,铁汁们,你们坚持下来了没?

原题:寻找峰值

题目描述:

峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

【敲黑板】:本题属于查找类题型,又看到时间复杂度是O(logN),所以不难想到二分查找


示例1:


1. 输入:nums = [1,2,3,1]
2. 输出:2
3. 解释:3 是峰值元素,你的函数应该返回其索引 2。


示例2:


1. 输入:nums = [1,2,1,3,5,6,4]
2. 输出:1 或 5
3. 解释:你的函数可以返回索引 1,其峰值元素为 2;
4.      或者返回索引 5, 其峰值元素为 6。


注意:

使用二分法是有要求的,前提是一定要有序! 那么这道题目该怎么去解呢?我们也不能去把它先排个序,因为会把索引弄乱,那该咋办呢?请朝后看...

找到了一个规律:

nums[mid] > nums[mid + 1] 时,mid前边一定存在峰值;

nums[mid] < nums[mid + 1] 时,mid+1后边一定存在峰值


代码执行


int findPeakElement(int* nums, int numsSize){
    //考虑特殊情况
    if(nums == NULL || numsSize == 0){
        return -1;
    }
    int left = 0;
    int right = numsSize - 1;
    int mid = 0;
    while(left <= right){
        //如果while循环中的表达式中没有判断==时的情况,这条语句也就可以省略了
        //之所以加上,是为了套用二分的那个结构,等到后面熟悉使用了就不会这样啦
        if(left == right){
            return left;
        }
        mid = left + (right - left) / 2;
        if(nums[mid] < nums[mid + 1]){
            //mid+1后边一定存在峰值
            left = mid + 1;
        }else{
            right = mid;
            //mid前边一定存在峰值
        }
    }
    return left;
}


复杂度分析


时间复杂度:O(logN)

空间复杂度:O(1)


结语


今天是力扣打卡第7天!

感谢力扣里面的大佬,向你们学习[致敬]!!

886,咱们明儿再见!!!


相关文章
|
3月前
|
算法 索引 Python
【Leetcode刷题Python】162. 寻找峰值
文章提供了使用二分查找法解决LeetCode "寻找峰值" 问题的Python实现,能够在对数时间复杂度内找到数组中的一个峰值元素的索引。
17 0
|
5月前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
6月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 162. 寻找峰值 算法解析
☆打卡算法☆LeetCode 162. 寻找峰值 算法解析
|
前端开发 算法 JavaScript
LeetCode寻找峰值使用JavaScript解题|前端学算法
LeetCode寻找峰值使用JavaScript解题|前端学算法
135 0
LeetCode寻找峰值使用JavaScript解题|前端学算法
|
索引
leetcode 寻找峰值
峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
|
算法 Java C#
LeetCode刷题162 - 简单 - 寻找峰值
LeetCode刷题162 - 简单 - 寻找峰值
203 0
LeetCode刷题162 - 简单 - 寻找峰值
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
55 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
108 2