題目大意:在給出的數組中找出峯值的索引,假設nums[-1]=nums[n]=-∞,如果有多個返回任意一個即可,要求時間複雜度O(logn),。
分析:二分查找。時間複雜度O(logn)自然聯想二分查找。利用好題裏的-∞條件來不斷縮小搜索空間:拿到mid,判斷nums[mid]和右側數據的大小關係,如果降序,說明峯值在[left,mid];如果升序,說明峯值在[mid+1,right]。
代碼:
方法一:線性查找。
class Solution {
public:
int findPeakElement(vector<int>& nums) {
for (int i = 0;i < nums.size() - 1;i++) {
if (nums[i] > nums[i + 1]) return i;
}
return nums.size() - 1;
}
};
方法二:二分查找。
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] > nums[mid + 1]) {
right = mid;
} else {
left = mid + 1;
}
}
return right;
}
};