zoukankan      html  css  js  c++  java
  • 领扣(LeetCode)寻找峰值 个人题解

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

    给定一个输入数组 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)的复杂度。

    于是考虑使用二分法,经典的O(logN)算法。找到中间的数,和左右两边对比,如果是最大的,直接输出。

    但是这一题挖的一个小坑会坑到初学者和不严谨的人(比如我),就是他会有int类型的最小值的判例,如果你假设的num[-1]和num[n]是手动输入的某个看起来很大的负值,会导致错误。建议使用编程语言自带的int类型最小值属性。

    代码如下:

     1 class Solution {
     2     public int findPeakElement(int[] nums) {
     3         int ans = 0;
     4         int begin = 0;
     5         int end = nums.length-1;
     6         int mid=0;
     7         while(begin<=end)
     8         {
     9             int leftnum,rightnum;
    10             mid=(begin+end)/2;
    11             leftnum=(mid==0?Integer.MIN_VALUE:nums[mid-1]);
    12             rightnum=(mid==nums.length-1?Integer.MIN_VALUE:nums[mid+1]);
    13             if(nums[mid]>leftnum&&nums[mid]>rightnum)
    14             {
    15                 return mid;
    16             }
    17             else if(leftnum>rightnum)
    18                 end=mid-1;
    19             else {
    20                 begin=mid+1;
    21             }
    22             
    23         }
    24         return ans;
    25     }
    26 }
  • 相关阅读:
    java中怎么解决路径中文的问题
    Json
    ajax
    MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法
    关于web.xml的格式
    关于RuntimException
    JNDI
    Dreamweaver使用过程的小技巧
    web-service客户端与服务器端的连接
    Python3
  • 原文地址:https://www.cnblogs.com/axiangcoding/p/9955317.html
Copyright © 2011-2022 走看看