领扣(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 }

 

posted @ 2018-11-13 22:40  AXiangCoding  阅读(427)  评论(0编辑  收藏  举报