峰值元素是指其值大于左右相鄰值的元素墩衙。
給定一個輸入數(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ù)雜度的岳服。
C++1
二分查找法。
首先希俩,判斷當(dāng)數(shù)組的長度為0的時候吊宋,直接返回-1
。
其次颜武,當(dāng)數(shù)組長度為1的時候璃搜,直接返回0就好了。
然后鳞上,使用二分法計算峰值的位置这吻,從示例中可以看出,峰值是大于左右兩邊的值的篙议,那么就以此作為判定條件唾糯,當(dāng)計算中間下標(biāo)的值小于右邊值的時候,那么我們把此時的mid+1
的下標(biāo)作為下次迭代的左下標(biāo)鬼贱,右下標(biāo)不變移怯;當(dāng)中間值大于等于右邊值的時候,我們把此中間下標(biāo)mid
賦值為下次迭代的右下標(biāo)这难,直到left==right
為止舟误,跳出循環(huán)。
class Solution {
public:
int findPeakElement(vector<int>& nums) {
long mid = 0, left = 0, right = nums.size()-1;
if(right == -1){
return -1;
}
if(right == 0){
return 0;
}
while(left < right){
mid = (left+right)/2; // 向下取整
if(nums[mid]<nums[mid+1]){
left = mid + 1;
}else{
right = mid;
}
}
return left;
}
};