前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从 O(N) 优化到 O(logN),你的第一想法是什么?

从 O(N) 优化到 O(logN),你的第一想法是什么?

作者头像
五分钟学算法
发布于 2020-03-28 12:46:52
发布于 2020-03-28 12:46:52
54100
代码可运行
举报
文章被收录于专栏:五分钟学算法五分钟学算法
运行总次数:0
代码可运行

题目描述

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

给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

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

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: nums = [1,2,1,3,5,6,4]
输出: 15 
解释: 你的函数可以返回索引 1,其峰值元素为 2;
     或者返回索引 5, 其峰值元素为 6

说明:

你的解法应该是 O(logN) 时间复杂度的。

题目解析

目让你找出一个数组中的 peak element,数组中可能存在一个或者多个 peak element,但是你只需要找出一个就好。

这道题目最直接的办法就是直接遍历一遍数组,然后将每个元素与其左右相邻的元素进行比较,符合条件输出即可。

显而易见,这么做时间复杂度是 O(n),n 为数组中元素的个数。

有没有更快的方法呢?

O(n) 还要快的话,一般来说只会是 O(lgn)O(1)O(1) 显然是不可能的,那么就只剩下 O(lgn)

通过这个时间复杂度,我相信你应该知道用什么样的算法,没错就是二分查找

那么用二分查找怎么做呢?

题目描述中有一个细节是,我们可以认为 arr[-1] == arr[n] == -Inf也就是两头的元素只需要和它相邻的一个元素比较即可。再进一步想,这里其实还隐藏了一个信息,就是我们二分查找顺着递增的方向去找的话就一定能够找到峰值

如果能够分析到这里,那么这道题基本上就算是解决了。

动画描述

参考代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//五分钟学算法
public int findPeakElement(int[] nums) {
    if (nums == null || nums.length == 0) {
        return -1;
    }

    int start = 0, end = nums.length - 1;
    while (start + 1 < end) {
        int mid = start + (end - start) / 2;

        if (nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) {
            return mid;
        } else if (nums[mid] > nums[mid - 1] && nums[mid] < nums[mid + 1]) {
            start = mid;
        } else {
            end = mid;
        }
    }

    if (nums[start] > nums[end]) {
        return start;
    }

    return end;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
我爱学算法之—— 二分查找(下)
暴力解法的时间复杂度是O(n);并且暴力解法它并没有用到题目中给的:nums[0]和nums[n]可以看做负无穷这一个条件。
星辰与你
2025/05/25
940
我爱学算法之—— 二分查找(下)
天天算法 LeetCode-162-寻找峰值
https://leetcode-cn.com/problems/find-peak-element/
灵魂画师牧码
2019/06/26
8150
天天算法 LeetCode-162-寻找峰值
搞定大厂算法面试之leetcode精讲5.二分查找
搞定大厂算法面试之leetcode精讲5.二分查找 视频教程(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12.堆 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 二分搜索 时间复杂度O(logn) 步骤: 从数组中间的元素开始,如果中
全栈潇晨
2021/11/24
3310
【二分查找】寻找峰值
​ 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
利刃大大
2025/04/04
710
【二分查找】寻找峰值
一网打尽!二分查找解题模版与题型全面解析
二分查找算是最为基本的一个算法,也比较容易掌握。但是有些时候,我们可能因为一些细节的点没有考虑全而程序出错。
五分钟学算法
2019/08/16
9160
一网打尽!二分查找解题模版与题型全面解析
☆打卡算法☆LeetCode 162. 寻找峰值 算法解析
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
恬静的小魔龙
2022/08/07
3370
☆打卡算法☆LeetCode 162. 寻找峰值 算法解析
【二分算法】——8个题目让你找到二分算法的感觉势如破竹
https://leetcode.cn/problems/binary-search/
用户11286421
2024/10/12
4460
【二分算法】——8个题目让你找到二分算法的感觉势如破竹
【常见题型总结】二分以及为何能二分(二段性的拓展)
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
宫水三叶的刷题日记
2023/01/03
4821
LeetCode 162. Find Peak Element
题目大意:在一个数组中寻找一个峰值,题目的最后一句话是一个关键,如果没有这句话,我想大多数首先想到的就是一个一个的判断,这样的话算法复杂度是O(n),实际上本题目只要求找到一个符合要求的就可以,题目中也明确的要求对数的算法复杂度,所以可以考虑利用二分查找法。
大学里的混子
2018/10/25
7320
【优选算法篇】剥洋葱式探索:用二分查找精准定位答案(下篇)
接上篇:【优选算法篇】寻找隐藏的宝藏:用二分查找打开算法世界的大门(上篇)-CSDN博客
熬夜学编程的小王
2024/12/24
680
【优选算法篇】剥洋葱式探索:用二分查找精准定位答案(下篇)
【算法专题】二分查找
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 - 1。
YoungMLet
2024/03/01
1530
【算法专题】二分查找
初识算法 · 二分查找(4)
​本文的主题是二分查找,通过三道题目讲解,一道是寻找峰值,一道是搜索旋转排序数组的最小值,一道是0 - n-1中缺失的数字。 链接分别为: 162. 寻找峰值 - 力扣(LeetCode)
_lazy
2024/11/19
820
初识算法 · 二分查找(4)
假期算法提升(带你彻底掌握二分查找)
呀哈喽,我是结衣 提到二分查找你会想到什么,数组一定是有序的?其实不是,我们求解二分查找问题最重要的是找到数组的二段性即可以根据这个性质把数组分为两段的性质,只要找到了这个我们就可以利用二分查找来解决问题。 同时在这篇博客当中,我也会带着大家来找到二分查找的模板,分为,普适性二分模板,查找左边界的二分模板,查找右边界的二分模板
Yui_
2024/10/15
1100
假期算法提升(带你彻底掌握二分查找)
leetcode-162-寻找峰值
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
chenjx85
2018/09/29
7860
【剑指offer|6.寻找峰值】
0.寻找峰值 关键点: 返回任意一个峰值的下标即可 nums[-1]=nums[n]=负无穷 输入:nums = [1,2,3,1] 输出:2 解释:3 是峰值元素,你的函数应该返回其索引 2 1.傻瓜编程(纯属玩乐) class Solution { public: int findPeakElement(vector<int>& a) { int n=a.size(); if(n==1) { return
MicroFrank
2023/04/12
2280
【剑指offer|6.寻找峰值】
【算法】二分法 ② ( 排序数组中查找目标值 | 二分法的经典写法 | 在排序数组中查找元素的最后一个位置 | 二分法的通用模板 )
https://leetcode.cn/problems/binary-search/
韩曙亮
2023/03/30
7910
二分算法详解
这是一道单纯的朴素二分模版题,当 left == right 时的这种情况也是需要考虑的,因为不排除数组中只有一个数的情况,或者是二分到数组中只剩一个数的情况,所以循环条件要写 left <= right
2的n次方
2024/10/15
1030
二分算法详解
LeetCode通关:数组十七连,真是不简单
数组基本上是我们最熟悉的数据结构了,刚会写“Hello World”不久,接着就是“杨辉三角”之类的练习。
三分恶
2021/08/10
4010
数据结构与算法:162. 寻找峰值
给你一个输入数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
早起的鸟儿有虫吃
2022/01/11
5830
数据结构与算法:162. 寻找峰值
寻找峰值、
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
狼啸风云
2023/12/18
1820
寻找峰值、
推荐阅读
相关推荐
我爱学算法之—— 二分查找(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验