LeetCode #162 Find Peak Element 尋找峰值

162 Find Peak Element 尋找峰值

Description:
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:

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.

Follow up:
Your solution should be in logarithmic complexity.

題目描述:
峰值元素是指其值大于左右相鄰值的元素。

給定一個輸入數(shù)組 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

數(shù)組可能包含多個峰值,在這種情況下,返回任何一個峰值所在位置即可。

你可以假設(shè) nums[-1] = nums[n] = -∞。

示例 :

示例 1:

輸入: nums = [1,2,3,1]
輸出: 2
解釋: 3 是峰值元素,你的函數(shù)應(yīng)該返回其索引 2。

示例 2:

輸入: nums = [1,2,1,3,5,6,4]
輸出: 1 或 5
解釋: 你的函數(shù)可以返回索引 1,其峰值元素為 2;
或者返回索引 5, 其峰值元素為 6。

說明:

你的解法應(yīng)該是 O(logN) 時間復(fù)雜度的。

思路:

  1. 逐個搜索
    搜索到第一個遞減的就是答案
    時間復(fù)雜度O(n), 空間復(fù)雜度O(1)
  2. 由于題目要求對數(shù)時間復(fù)雜度, 考慮二分法
    由于數(shù)組中 nums[i] != nums[i + 1],
    若nums[mid] > nums[mid + 1](注意 nums[mid] != nums[mid + 1]), 則 mid有可能是 peak, 去掉右半部分, 即 right = mid
    否則, 去掉左半部分, 即 left = mid + 1
    時間復(fù)雜度O(lgn), 空間復(fù)雜度O(1)
  3. 由于最大值一定是峰值
    直接返回最大值下標即可
    時間復(fù)雜度O(n), 空間復(fù)雜度O(1)

代碼:
C++:

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

Java:

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

Python:

class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        return nums.index(max(nums))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容