> 技术文档 > 二分查找-162.寻找峰值-力扣(LeetCode)

二分查找-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& nums)//解法1 { int n = nums.size(); for(int i = 0;inums[i+1]) return i; } return n-1; }

解法2:

int findPeakElement(vector& nums)//解法2 { int left = 0,right = nums.size()-1; while(leftnums[mid+1]) right = mid; else left = mid + 1; } return right; }

 

 

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!