当前位置: 首页 > article >正文

Leetcode面试经典150题-162.寻找峰值

 解法都在代码里,不懂就留言或者私信

想清楚的话会特别简单,你可能想不到这是个二分。。。

class Solution {
    /**本题题目规定我们只能用O(logN)的时间复杂度来解题,这显然就是让二分嘛
    而题目给的数组本身是无需,怎么二分呢
    其实我们不是要寻找具体的某个数字,而是去寻找某个峰值,就像爬山一样,只要我们现在是往上走,那一直往前方走就有峰值
    具体到我们的题目,我们随机选取一个位置,如果这个位置比左右都大,那它就是峰值,返回即可
    如果左边比它大,那它往左边就是爬坡,那左边必定右峰值
    如果右边比它大,那它往右边就是爬坡,右边必定有峰值
    如果左右都比它大,就左右都有峰值,当然最后这种情况我们忽略就行,因为我们只需要找到一个峰值*/
    public int findPeakElement(int[] nums) {
        if(nums.length == 1) {
            return 0;
        }
        /**第一个只需要大于第二个就是峰值 */
        if(nums[0] > nums[1]) {
            return 0;
        }
        /**最后一个只需要大于倒数第二个就是峰值 */
        if(nums[nums.length-1] > nums[nums.length - 2]) {
            return nums.length - 1;
        }
        /**如果第一个和最后一个都不是峰值,我们从1~nums.length-2里找*/
        int left = 1;
        int right = nums.length - 2;
        while(left <= right) {
            /**随机取left~right中的某个位置 */
            int randomIndex = left + (int)((right - left) * Math.random());
            /**如果比左右都大,那不就是我们的答案吗,这么写不会越界吗?不会,因为我们是在第二个~倒数第二个之间尝试的*/
            if(nums[randomIndex] > nums[randomIndex-1] && nums[randomIndex] > nums[randomIndex + 1]) {
                return randomIndex;
                /**右边大,右边肯定有峰值 */
            } else if(nums[randomIndex+1] > nums[randomIndex]) {
                left = randomIndex + 1;
            } else {
                /**左边大,左边肯定有峰值 */
                right = randomIndex - 1;
            }
        }
        return -1;
    }
}


http://www.kler.cn/news/303958.html

相关文章:

  • 《Docker:轻量级虚拟化解决方案》
  • Spring MVC 处理请求
  • 低代码-赋能新能源汽车产业加速前行
  • Anolis 8 NVME over TCP 配置使用
  • Qt-常用控件(3)-输入类
  • 【C++】深究C++三大特性之多态
  • 香港电讯SASE解决方案:终端与云端的安全护航
  • C语言 13 指针
  • 【Unity新闻】Unity将取消Runtime费用
  • Where I can save my openai-apikey safely for my flutter app
  • 【docker】docker 关键技术 —— 镜像制作
  • 宝塔部署Vue项目解决跨域问题
  • 【机器学习】自然语言处理中的Transformer模型:深度解析与前沿发展
  • 从GreaterWMS学习仓库管理系统
  • 在Word中,用VBA比较两段文本的相似度
  • AI创作新手册:精通Prompt提示词的提问策略
  • 基于鸿蒙API10的RTSP播放器(一:基本界面的实现)
  • 【Qt笔记】QScrollArea控件详解
  • 电脑安装OpenWRT系统
  • 黑龙江等保测评二级系统费用解析:如何合理预算?
  • (web自动化测试+python)2
  • Autosar(Davinci) --- 创建一个S/R类型的port(下)
  • 【设计模式】设计模式的八大原则
  • Kafka3.6.0 linux 安装,非zk模式
  • QT如何ui上的QTableWidget控件如何使用
  • HarmonyOS开发实战( Beta5.0)自定义装饰器实践规范
  • 【自动驾驶】控制算法(八)横向控制Ⅱ | Carsim 与 Matlab 联合仿真基本操作
  • Android 车联网——汽车系统介绍(附2)
  • Python 课程6-Pandas 和 Matplotlib库
  • MATLAB中的控制系统工具箱:深入指南与实践应用