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

后端开发刷题 | 寻找峰值【二分法】

描述

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。

1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于

2.假设 nums[-1] = nums[n] = −∞

3.对于所有有效的 i 都有 nums[i] != nums[i + 1]

4.你可以使用O(logN)的时间复杂度实现此问题吗?

数据范围:

1≤nums.length≤2×10^5

−2^31<=nums[i]<=2^31−1

如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:

示例1

输入:

[2,4,1,2,7,8,4]

返回值:

1

说明:

4和8都是峰值元素,返回4的索引1或者8的索引5都可以     

示例2

输入:

[1,2,3,1]

返回值:

2

说明:

3 是峰值元素,返回其索引 2  

思路分析:

该题只要找出一个峰值即可,可以使用二分法,判断mid附近的元素来寻找峰值,如果mid右边的元素大于mid的数值,那么峰值可能出现在右半部分,只要将left=mid+1,再判断它右边的元素是否小于它,即可找到峰值;反之mid右边的元素小于mid的数值,那么峰值可能出现在左半部分,只要将right=,再判断它左边的元素。

代码:

import java.util.*;public class Solution {/*** * @param nums int整型一维数组 * @return int整型*/public int findPeakElement (int[] nums) {int left=0,right=nums.length-1;while(left<right){int mid=(left+right)/2;//如果mid的下一个元素比它大,则峰值应该产生在mid+1这边if(nums[mid]<nums[mid+1]){left=mid+1;}else{right=mid;}}return left;}
}


http://www.mrgr.cn/news/1809.html

相关文章:

  • 第N7周:调用Gensim库训练Word2Vec模型
  • 08结构型设计模式——适配器模式
  • 证书|“机器学习工程师”来了,由工业和信息化部教育与考试中心颁发,含金量高
  • 1.微服务发展阶段
  • 【Android】Android AOP 编程框架
  • ActiveMQ、RabbitMQ、Kafka、RocketMQ在优先级队列、延迟队列、死信队列、重试队列、消费模式、广播模式的区别
  • CentOS主机名修改
  • 【区块链+金融服务】供应链金融平台 | FISCO BCOS应用案例
  • 动态规划-下降路径最小和
  • Chromium编译指南2024 - Android篇:从Linux版切换到Android版(六)
  • Vite 与 Vue:分开的发展路径
  • [000-01-030].Zookeeper学习大纲
  • 自定义组件上传到maven中央仓库2024实测可用最详细版
  • ES 聚合查询
  • 【GH】【EXCEL】P1: Write DATA SET from GH into EXCEL
  • Linux第九节课 - git / gdb
  • Axios使用
  • jmeter引入jar包的三种方式
  • 【专题】2024全数驱动 致胜未来-数字化敏捷银行白皮书报告合集PDF分享(附原数据表)
  • 2024深圳国际汽车改装与定制技术展览会