| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 二分法:LeetCode162 - 寻找峰值 -> 正文阅读 |
|
[数据结构与算法]二分法:LeetCode162 - 寻找峰值 |
题目: A peak element is an element that is strictly greater than its neighbors. Given an integer array nums, find a peak element, and return its index. If the array contains multiple peaks, return the index to any of the peaks. You may imagine that nums[-1] = nums[n] = -∞. You must write an algorithm that runs in O(log n) time. 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组?nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设?nums[-1] = nums[n] = -∞ 。 你必须实现时间复杂度为 O(log n) 的算法来解决。 思路: 这道题的朴素方法非常直接,遍历一次即可,但是二分法很难想。二分法的关键是每次舍弃掉一半的答案。那么如何才能每次判断该舍弃哪一边呢?可以这样分情况讨论: 首先判断两个边界是否符合条件,这样后面判断不会出现溢出 然后对于其中的某一位数nums[i],如果nums[i]<nums[i+1],那么右边一定会存在一个峰值。证明很简单,如果存在某个数开始比上一个数小,那么上一个数便是峰值;如果不存在,那么边界条件就是峰值。同理可以证明nums[i]<nums[i-1]的情况。 此时的代码复杂度为O(logn) 力扣的官方解法提供了以随机数为基础的二分法,本质是一样的。但是其中随机取数的方法值得学习。产生一个随机数利用函数rand()
题解: 朴素方法
二分法
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 17:48:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |