LeetCode - 162. Find Peak Element - 思路詳解 - C++

題目

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

Given an input array where num[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 that num[-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.

翻譯

一個峯值元素,即該元素大於左右鄰接元素

假設給定數組中元素,num[i] != num[i+1]。找出數組中的峯值元素並返回其索引。

這個數組可能包含多個峯值,在這種情況下,返回任意一個索引都是可以的。

你可以想想num[-1]和num[n]爲負無窮。

思路

思路1,採用暴力法,即遍歷數組,對比左右,時間複雜度爲O(n)

思路2,採用二分查找法。
首先定義兩個遊標,start和end。得到中間索引mid = (start+end)/2;

  • 1,如果num[mid-1] < num[mid] 且 num[mid] < num[mid+1] 則說明,峯值在右半部分。start = mid+1
  • 2,如果num[mid-1] > num[mid] 且 num[mid] > num[mid+1],則說明,峯值在左半部分。end = mid-1
  • 3,如果num[mid-1] < num[mid] 且 num[mid] > num[mid+1],則mid處就是峯值。
  • 4,如果num[mid-1] > num[mid] 且 num[mid] < num[mid+1],則說明該數組不止一個峯值,此時start = mid+1,或者end = mid-1均可。
  • -

代碼

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int len = nums.size()-1;
        int start = 0;
        int end = nums.size()-1;

        if(nums.size() == 1){
            return 0;
        }
        //首先判斷首尾是否存在
        if(nums[0] > nums[1]){
            return 0;
        }

        if(nums[len] > nums[len-1]){
            return len;
        }

        while(start <= end){
            int mid = (start+end)/2;
            if(nums[mid] > nums[mid+1] && nums[mid-1] < nums[mid]){
                return mid;
            }else{
                if(nums[mid] < nums[mid+1] && nums[mid-1] < nums[mid]){
                    start = mid+1;
                }

                if(nums[mid] > nums[mid+1] && nums[mid-1] > nums[mid] ){
                    end = mid-1;
                }

                if(nums[mid] < nums[mid+1] && nums[mid-1] > nums[mid]){
                    start = mid+1;
                }
            }
        }
        return start;
    }



};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章