leetcode_find_peak_element

难度:Medium

因为nums[i] != nums[i+1],i=0时,nums[0] > nums[-1],只需查看右边界,如果nums[1] nums[0],则前两个元素为升序,继续找下一个,直到最后一个元素。

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int i = 1;
for(; i < nums.size();i++)
{
if(nums[i] < nums[i-1])
return i-1;
}
return i-1;
}
};

运行结果:6ms,超过14.08%


看到提示是二分查找,顺着思路。找到nums[mid]后,跟左右的比较,如果不符合条件,肯定要从大的那一侧继续找。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
public:
int findPeakElement(vector<int>& nums) {
if(nums.size() <= 1) return 0;
int left = 0;
int right = nums.size()-1;
while(left <= right)
{
int mid = left + (right-left)/2;
if(mid == 0 )
{
if(nums[mid] < nums[mid+1])
left = mid+1;
else
return mid;
}
else if(mid == nums.size()-1)
{
if(nums[mid] < nums[mid-1])
right = mid-1;
else
return mid;
}
else
{
if(nums[mid] > nums[mid-1] && nums[mid] > nums[mid+1])
return mid;
else if(nums[mid] > nums[mid-1] && nums[mid] < nums[mid+1])
left = mid+1;
else
right = mid-1;
}
}
return -1;
}
};

运行结果:6ms,超过14.08%