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

打印 上一主题 下一主题

主题 976|帖子 976|积分 2928

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
形貌

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组大概包罗多个峰值,在这种情况下,返回任何一个所在位置即可。
1
.峰值元素是指其值严酷大于左右相邻值的元素。严酷大于即不能有等于
2
.假设 nums[-1
] &#61
; nums[n] &#61
; −∞
3.对于全部有效的 i 都有 nums !&#61
; nums[i + 1
]
4.你可以利用O(logN)的时间复杂度实现此问题吗&#xff1
f;
数据范围&#xff1
a;
1
≤nums.length≤2
×1
0^5
−2
^31
<&#61
;nums<&#61
;2
^31
−1

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

[img=533,566]https://img-blog.csdnimg.cn/img_convert/81
f840c6a531
30447a60c2
30578f1
2
70.png[/img]

示例1


输入&#xff1
a;
  1. [2
  2. ,4,1
  3. ,2
  4. ,7,8,4]
复制代码
返回值&#xff1
a;
  1. 1
复制代码
说明&#xff1
a;
  1. 4和8都是峰值元素,返回4的索引1
  2. 或者8的索引5都可以     
复制代码
示例2


输入&#xff1
a;
  1. [1
  2. ,2
  3. ,3,1
  4. ]
复制代码
返回值&#xff1
a;
  1. 2
复制代码
说明&#xff1
a;
  1. 3 是峰值元素,返回其索引 2
  2.   
复制代码
思绪分析&#xff1
a;


该题只要找出一个峰值即可,可以利用二分法,判定mid附近的元素来寻找峰值,如果mid右边的元素大于mid的数值,那么峰值大概出现在右半部分,只要将left&#61
;mid+1
,再判定它右边的元素是否小于它,即可找到峰值&#xff1
b;反之mid右边的元素小于mid的数值,那么峰值大概出现在左半部分,只要将right&#61
;,再判定它左边的元素。
代码&#xff1
a;


  1. import java.util.*;public class Solution {    /**     *      * @param nums int整型一维数组      * @return int整型     */    public int findPeakElement (int[] nums) {        int left&#61
  2. ;0,right&#61
  3. ;nums.length-1
  4. ;        while(left<right){            int mid&#61
  5. ;(left+right)/2
  6. ;            //如果mid的下一个元素比它大,则峰值应该产生在mid+1
  7. 这边            if(nums[mid]<nums[mid+1
  8. ]){                left&#61
  9. ;mid+1
  10. ;            }else{                right&#61
  11. ;mid;            }                    }        return left;            }}
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao1
2
3.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表