162. 寻找峰值
O(n)时间复杂度,简单的遍历
当全都升序的时候。只有最后一个元素是山峰。没有符合nums[i] > nums[i + 1]
的
当全都降序的时候。第一个元素是山峰,直接返回。第一个元素符合nums[i] > nums[i + 1]
,后面的符合但是不是解,但是由于已经直接返回了,所以不会影响结果。
当中间有转折的时候。nums[i] > nums[i + 1]
必定是符合的。
存不存在符合nums[i] > nums[i + 1]
但是不是山峰的情况呢?只在全都降序时候第一个元素之后的存在。而这种情况上面说了对结果没有影响。总而言之就是只需要判断nums[i] > nums[i + 1]
就可以了。
1 | class Solution { |
O(logn)二分查找
当nums[mid] > nums[mid + 1]
时
这时候他处于一个递减子序列中,那么他的左边必定存在一个山峰,即使左边全是递减的,那么结果也会是左边的第一个元素。
如果他处于一个递增子序列,那么山峰一定会在他的右边。
如果恰好是lo和hi中间一块为单调,但lo和hi又不等于开头和结尾。
假设中间一块单调增加,如果之前的hi要到现在的hi,必定在那里存在一个山峰。
如果中间一块单调减少,如果之前的lo要到现在的lo,必定也在那里存在一个山峰。
1 | class Solution { |