题意理解
寻找一个序列的峰值所在的序列,比左右元素要大,默认序列的最左边和最右边都是最小值。
问题分析
搜索
顺序搜索
分两种情况,一个元素,多个元素,多个元素分三种情况,第一个元素是否是峰值,最后一个元素是否是峰值,其他元素是否是峰值。
O(n)
二分搜索
因为最左边和最右边默认为最小值,那么左右都是向两边递减的。只要数组中存在一个元素比相邻元素大,那么沿着它一定可以找到一个峰值。
O(nlogn)
其他
链接
int findPeakElement(vector<int>& nums) {
int len = nums.size(); //长度
if (len == 1) { //只有一个元素,肯定是峰值,返回0
return 0;
}
if (nums[0] > nums[1]) //多个元素情况,手动判断第一个元素
return 0;
if (nums[len - 1] > nums[len - 2]) //多个元素情况,手动判断最后一个元素
return len - 1;
for(int i = 1; i != len - 1; i ++) { //多个元素情况,循环判断中间元素
if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) {
return i;
}
}
return -1;
}
int findPeakElement(vector<int>& nums) {
int len = nums.size();
if (len < 2)
return 0;
int l = 0, r = len - 1;
while (l < r) {
int mid = l + (r -l) / 2;
if (nums[mid] > nums[mid + 1]) {
r = mid;
}
else {
l = mid + 1;
}
}
return l;
}