题目描述

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

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

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

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

示例 1:

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

示例 2:

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

说明:

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


解题思路

从说明来看,要求时间复杂度是 O(logN) ,这就几乎摆明了要用二分搜索了。

但是常规的二分搜索是要搜索一个特定的,具体的元素在集合中的位置,在这一题中要找的元素并不是一个具体的值,而是一个具有某种特征(峰值)的值,如何将二分法转换一下运用到这里呢?

与传统的二分搜索设置一个mid指针不同的是,我们设置两个,mid1mid2,来保证边界的外侧总是小于边界的,这样通过边界更新,我们可以保证递归/迭代会在局部峰值处结束。

Java 实现

递归实现

public int findPeakElement (int[] nums) {return helper(nums, 0, nums.length - 1);
}private int helper (int[] nums, int lo, int hi) {if (lo == hi) {return lo;} else {int mid1 = (lo + hi) / 2;int mid2 = mid1 + 1;if (nums[mid1] > nums[mid2]) {return helper(nums, lo, mid1);} else {return helper(nums, mid2, hi);}}
}

迭代实现

public int findPeakElement (int[] nums) {return helper(nums, 0, nums.length - 1);
}private int helper (int[] nums, int lo, int hi) {while (lo < hi) {int mid1 = (lo + hi) / 2;int mid2 = mid1 + 1;if (nums[mid1] < nums[mid2]) {lo = mid2;} else {hi = mid1;}}return lo;
}

心得体会

二分搜索是根据mid1mid2的关系对搜索区域进行调整的,确保边界外侧小于边界,从而确保最后在局部峰值处结束递归/迭代。

转载于:https://www.cnblogs.com/yuzhenzero/p/10470980.html

【LeetCode】162-寻找峰值相关推荐

  1. java 寻找峰值峰谷_Java实现 LeetCode 162 寻找峰值

    162. 寻找峰值 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返 ...

  2. LeetCode 162. 寻找峰值(二分查找)

    1. 题目 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返回任何一 ...

  3. LeetCode 162. 寻找峰值

    为什么二分查找大的那一半一定会有峰值呢?(即nums[mid]<nums[mid+1]时,mid+1~N一定存在峰值) 我的理解是,首先已知 nums[mid+1]>nums[mid],那 ...

  4. Leetcode 162. 寻找峰值 解题思路及C++实现

    解题思路: 这道题应该归为简单,只要找到第一个降序的值就可以了. class Solution { public:int findPeakElement(vector<int>& ...

  5. python寻峰,[LeetCode][Python]162. 寻找峰值

    [LeetCode][Python]162. 寻找峰值 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数 ...

  6. leetcode刷题 162.寻找峰值

    题目分析: 通过题目,我们发现这题的本质是寻找一段数组范围内的最大值,我们可以通过不断的缩小数组范围来寻找目标值,由缩小数组范围我们可以联想到二分查找,但是此二分查找有一不同点,就是中值不是同左右界值 ...

  7. 【LeetCode笔记】162. 寻找峰值(Java、二分、偏数学)

    文章目录 题目描述 思路 && 代码 1. 暴力法 O(n) 2. 二分法 O(logN) 二刷 打卡第十七天- 题目描述 难点在于 logN 复杂度 思路 && 代码 ...

  8. leetcode 162. Find Peak Element | 162. 寻找峰值(二分法找局部最大值)

    题目 https://leetcode.com/problems/find-peak-element/ 题解 2021-7-21 16:28:31 更新版思路: 根据左神在 课上 说的,可以使用二分法 ...

  9. python寻峰,LeetCode-python 162.寻找峰值

    题目链接 难度:中等       类型: 数组 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包 ...

  10. leetcode 寻找峰值

    162. 寻找峰值 峰值元素是指其值严格大于左右相邻值的元素. 给你一个整数数组 nums,找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可. 你可以假设 ...

最新文章

  1. 跨链(8)Cosmos之“跨链交互协议IBC”前言
  2. IJCAI 2019 论文解读 | 基于超图网络模型的图网络进化算法
  3. 局域网连接SQL Server数据库配置
  4. 工业机器人 扬州 江都_扬州市14家企业获批2019年江苏省示范智能车间
  5. Guava之RangeMap
  6. erlang有前途吗_带有示例的Erlang概述
  7. 帆软报表重要Activator之DesignerStartup
  8. Maven如何手动添加jar包到本地Maven仓库
  9. java oracle spool,oracle之spool详细使用总结
  10. org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.itheima.
  11. 【论文译文】BigGAN
  12. 计算机快速录入,如何快速把书中的文字扫描并录入电脑
  13. 【宋红康 MySQL数据库 】【高级篇】【10】索引的创建与删除_MySQL8.0的索引新特性
  14. WORD导出PDF生成书签
  15. Android:SQLite数据库学习小结
  16. java创建短信平台_Java通过SMS短信平台实现发短信功能
  17. SIMCom芯片关于GPS定位信息的的解析(AT+CGNSINF)
  18. Mysql数据库可视化工具Navicat使用
  19. 用java做出长方体的表面积_编写java程序,输入一个长方体的长、宽、高,求长方体的表面积和体积,并将结果显示,一个长方体的...
  20. 黑马程序员_网络电视用中国电信路由器不能联网的问题

热门文章

  1. Reflector:.NET反编译工具及导出CS文件插件
  2. 2017.11.24 Stm8L151-factory
  3. 云端模糊测试挖洞实例
  4. c#调用c++ dll的一个例子
  5. 在centos6.5上编译安装httpd-2.4和2.4版本特性介绍
  6. 如何做一个让开发人员看得起的软件测试人员
  7. CleanMyMac X2021专业苹果电脑系统优化工具
  8. Spring的Controller是单例还是多例,怎么保证并发的安全
  9. 某生鲜平台面试题:如何保证库存在高并发的场景下是安全的?
  10. 百度开源移动端深度学习框架mobile-deep-learning(MDL)