求数组的局部峰值-LeetCode162

A peak element is an element that is greater than its neighbors.

Given an input array nums, where nums[i] ≠ nums[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

You may imagine that nums[-1] = nums[n] = -∞.

Example 1:

Input: nums = [1,2,3,1]
Output: 2
Explanation: 3 is a peak element and your function should return the index number 2.

Example 2:

Input: nums = [1,2,1,3,5,6,4]
Output: 1 or 5 
Explanation: Your function can return either index number 1 where the peak element is 2, 
             or index number 5 where the peak element is 6.
 //考虑使用类似于二分查找法来缩短时间,由于只是需要找到任意一个峰值,那么我们在确定二分查找折半后中间那个元素后,和紧跟的那个元素比较下大小,如果大于,则说明峰值在前面,如果小于则在后面。这样就可以找到一个峰值了,代码如下:
    public int findPeakElement(int[] nums) {
//          int low = 0;
//         int high = nums.length-1;
        
//         while(low < high)
//         {
//             int mid1 = (low+high)/2;
//             int mid2 = mid1+1;
//             if(nums[mid1] < nums[mid2])//最大值在后面
//                 low = mid2;
//             else
//                 high = mid1;
//         }
//         return low;
        
        
        
       // 下面这种解法就更加的巧妙了,由于题目中说明了局部峰值一定存在,那么实际上可以从第二个数字开始往后遍历,如果第二个数字比第一个数字小,说明此时第一个数字就是一个局部峰值;否则就往后继续遍历,现在是个递增趋势,如果此时某个数字小于前面那个数字,说明前面数字就是一个局部峰值,返回位置即可。如果循环结束了,说明原数组是个递增数组,返回最后一个位置即可,参见代码如下:
      for(int i = 1; i < nums.length; i ++)
        {
            if(nums[i] < nums[i-1])//从第二个数字开始往后遍历,如果第二个数字比第一个数字小,说明此时第一个数字就是一个局部峰值
            {// <
                return i-1;
            }
        }
        return nums.length-1;//循环结束没有返回,说明是一个递增的趋势
    }

猜你喜欢

转载自blog.csdn.net/si444555666777/article/details/81264391