A peak element is an element that is strictly greater than its neighbors.
Given an integer array nums
, find a peak element, and return its index. If the array contains multiple peaks, return the index to any of the peaks.
You may imagine that nums[-1] = nums[n] = -∞
.
You must write an algorithm that runs in O(log n)
time.
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: 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.
Constraints:
1 <= nums.length <= 1000
-231 <= nums[i] <= 231 - 1
-
nums[i] != nums[i + 1]
for all validi
.
寻找峰值。
峰值元素是指其值大于左右相邻值的元素。
给你一个输入数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞ 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-peak-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给一个数组,数组满足条件nums[i] ≠ nums[i+1],求数组峰值的下标。这个题的????多于????,估计是因为峰值不止一个吧,我做的时候也踩了坑。
思路是用二分法,因为题目要求时间复杂度是 log 级别。根据左右指针计算中间位置 m,并比较 m 与 m+1 的值,如果 m 较大,则左侧存在峰值,r = m,如果 m + 1 较大,则右侧存在峰值,l = m + 1
时间O(logn)
空间O(1)
JavaScript实现
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var findPeakElement = function(nums) { 6 let start = 0; 7 let end = nums.length - 1; 8 while (start + 1 < end) { 9 let mid = Math.floor(start + (end - start) / 2); 10 if (nums[mid] > nums[mid + 1]) { 11 end = mid; 12 } else { 13 start = mid; 14 } 15 } 16 if (nums[start] > nums[end]) return start; 17 return end; 18 };
Java实现
1 class Solution { 2 public int findPeakElement(int[] nums) { 3 int start = 0; 4 int end = nums.length - 1; 5 while (start + 1 < end) { 6 int mid = start + (end - start) / 2; 7 if (nums[mid] > nums[mid + 1]) { 8 end = mid; 9 } else { 10 start = mid + 1; 11 } 12 } 13 if (nums[start] > nums[end]) { 14 return start; 15 } else { 16 return end; 17 } 18 } 19 }
相关题目