题解 | #寻找峰值# [P2]

寻找峰值

http://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76


对于i: 
如果i左右相邻的柱子都没i高,那么i就是peak, return i.
如果i右边相邻的柱子比i高,那么i的右侧一定存在peak, binarySearch right
如果i左边相邻的柱子比i高,那么i的左侧一定存在peak, binarySearch left
(如果左右都比i高,两遍都有peak, 随便挑一边search)

why?反证法.比如右边相邻的柱子比i高情况下,假设右边不存在peak, 那么右边必须单调递增。
但是最右边nums[n]=-INFINITE, 所以不可能单调递增 -> 假设不成立。
import java.util.*;

public class Solution {
    public int findPeakElement (int[] nums) {
      int l = 0, r = nums.length;
      // binary search nums[l, r)
      while (l < r) {
        int m= l + ((r-l) >> 1);
        boolean higherThanLeft = m-1 < 0 || nums[m] > nums[m-1];
        boolean higherThanRight = m+1 >= nums.length || nums[m] > nums[m+1];
        if (higherThanLeft && higherThanRight) 
          return m;  // found
        else if (higherThanRight) 
          r = m;  // search left
        else 
          l = m + 1;
      }
      return -1;  // shouldn't get here
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-04 18:02
好不容易拿到了字节Offer,鼠鼠做后端的,但家里人觉得可能被裁员不稳定,让鼠鼠去投国企,现在好纠结到底该咋选
文档传偷助手:该投就投吧,不过建议别放弃offer 拿到手里的才是最好的
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务