LeetCode 162.Find Peak Element (尋找峰值)
阿新 • • 發佈:2018-12-16
題目描述:
峰值元素是指其值大於左右相鄰值的元素。
給定一個輸入陣列 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;
}
};