二分查找-162.寻找峰值-力扣(LeetCode)
一、题目解析
1.峰值元素是指其值严格大于左右相邻的元素
2.找到峰值元素并返回索引,如果包含多个峰值,返回任意一个峰值所在位置
3.时间复杂度为O(logN)
二、 算法原理
解法1:暴力解法
图1表示nums[0]>nums[1],即第一个值就是峰值;图2表示在范围内的某一处出现nums[i]>nums[i+1],即找到峰值;图3表示在数组长度内没有找到nums[i]>nuns[i+1],即峰值为nums[nums.size()-1]
暴力解法即从第一个位置开始,一直向前走,分情况讨论;分析图3我们可以知道暴力解法的时间复杂为O(N),但由于数据长度只有1000,所以暴力解法也是可以通过的
解法2:二分查找
二段性
细节问题
1.数据长度为1000,暴力解法也能通过
2.数据大小为[-2^31,2^31-1],所以在计算mid的时候可以用long long来存储数据
三、代码示例
解法1:
int findPeakElement(vector<int>& nums)//解法1{int n = nums.size();for(int i = 0;i<n-1;i++){if(nums[i]>nums[i+1]) return i;}return n-1;}
解法2:
int findPeakElement(vector<int>& nums)//解法2{int left = 0,right = nums.size()-1;while(left<right){long long mid = left + (right-left)/2;if(nums[mid]>nums[mid+1]) right = mid;else left = mid + 1;}return right;}