[LeetCode] 162. Find Peak Element 查找峰值元素 All LeetCode Questions

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

Given an input array wherenum[i] ≠ num[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 thatnum[-1] = num[n] = -∞.

For example, in array[1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.

click to show spoilers.

Note:

Your solution should be in logarithmic complexity.

Credits:
Special thanks to@tsfor adding this problem and creating all test cases.

给一个数组,寻找里面的峰值元素。峰值是比它两边的元素都大。

提示了用log的时间复杂度,所以考虑用二分法Binary Search。

规律一:如果nums[i] > nums[i+1],则在i之前一定存在峰值元素
规律二:如果nums[i] < nums[i+1],则在i+1之后一定存在峰值元素

参考:Orange橘子洲头

Java:

public class Solution {  
    public int findPeakElement(int[] nums) {  
        int left = 0, right = nums.length - 1;  
        while (left < right) {  
            int mid = (left + right) / 2;  
            if(nums[mid] < nums[mid + 1]) left = mid + 1;  
            else right = mid;  
        }  
        return left;  
    }  
}    

Python:

class Solution(object):    
    def findPeakElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        left, right = 0, len(nums) - 1
        
        while left < right:
            mid = left + (right - left) / 2
            if nums[mid] > nums[mid + 1]:
                right = mid
            else:
                left = mid + 1
       
        return left

C++:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        
        while (left < right) {
            const auto mid = left + (right - left) / 2;
            if (nums[mid] > nums[mid + 1]) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
       
        return left;
    }
};

All LeetCode Questions List 题目汇总

相关推荐