
难度: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%
近期评论