1. 程式人生 > >LeetCode 162.Find Peak Element (尋找峰值)

LeetCode 162.Find Peak Element (尋找峰值)

題目描述:

峰值元素是指其值大於左右相鄰值的元素。

給定一個輸入陣列 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素並返回其索引。

陣列可能包含多個峰值,在這種情況下,返回任何一個峰值所在位置即可。

你可以假設 nums[-1] = nums[n] = -∞

示例 1:

輸入: nums = [1,2,3,1]
輸出: 2
解釋: 3 是峰值元素,你的函式應該返回其索引 2。

示例 2:

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

說明:

你的解法應該是 O(logN)時間複雜度的。

AC C++ Solution:

思路:

1.遍歷一遍元素,和左右相鄰的相比較。(第一個和最後一個元素單獨判斷)

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        if(nums[0] > nums[1])
            return 0;
        
        if(nums[nums.size()-1] > nums[nums.size()-2])
            return nums.size()-1;
        
        for(int i = 1; i < nums.size()-1; i++) {
            if(nums[i] > nums[i-1] && nums[i] > nums[i+1]) 
                return i;
        }
        
        return 0;
    }
};

2.順序搜尋:

class Solution {
public:
    int findPeakElement(const vector<int> &num) {
        for(int i = 1; i < num.size(); i ++)
        {
            if(num[i] < num[i-1])
            {// <
                return i-1;
            }
        }
        return num.size()-1;
    }
};

3.二分搜尋:迭代

class Solution {
public:
    int findPeakElement(const vector<int> &num) 
    {
        int low = 0;
        int high = num.size()-1;
        
        while(low < high)
        {
            int mid1 = (low+high)/2;
            int mid2 = mid1+1;
            if(num[mid1] < num[mid2])
                low = mid2;
            else
                high = mid1;
        }
        return low;
    }
};