栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

leetcode-162寻找峰值

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode-162寻找峰值

leetcode刷题 162. 寻找峰值 题目

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

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

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

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

nums[i] != nums[i + 1]

分析

本文的问题是找到任何一个峰值即可。所以使用二分法需要判断哪部分区域存在峰值。

对于nums[mid],存在两种可能

  1. mid为峰值点,直接返回即可

  2. mid不为峰值点,即两侧一个大于nums[mid],一个小于nums[mid]

    针对于上升的一侧,如果往上升方向一直升序,则终点为峰值;如果出现第一个降序的转折点,则那个点为峰值点

    所以mid上升方向一定会存在峰值点

代码
public int findPeakElement(int[] nums) {
    if (nums.length==1)
        return 0;
    if (nums.length==2){
        return nums[1]>nums[0] ? 1 : 0;
    }
    int left=0;
    int right = nums.length-1;
    int mid;
    while(left<=right){
        mid = (left + right) / 2;
        if ((mid==0 && nums[mid]>nums[mid+1]) || (mid==nums.length-1 && nums[mid]>nums[nums.length-2]) || ( mid>0 && midnums[mid-1] && nums[mid]>nums[mid+1])){
            return mid;
        }
        else if (nums[mid+1]>nums[mid]){
            left = mid+1;
        }
        else{
            right = mid-1;
        }
    }
    return -1;
}
结果

时间超过100.00%

内存超过81.78%

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944662.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号