zoukankan      html  css  js  c++  java
  • Leetcode#162 Find Peak Element

    原题地址

    很有意思的一道题,二分搜索求极值。

    题目中已经说明num[i] != num[i+1],即相邻元素不可能相等,所以相邻元素间的大小关系要么是大于,要么是小于,这就是二分搜索的判断条件。

    假设左边界是l,右边界是r,中点m=(l+r)/2

    如果num[m]比左右两边都大,那么num[m]就已经是极值了,返回m

    如果num[m]比左边大比右边小,即num[m+1]>num[n],那么右半边肯定有极值(这个很容易证明,以后有时间补充),砍掉左半边并继续

    如果num[m]比右边大比左边小,即num[m-1]>num[n],那么同理,左半边肯定有极值,砍掉右半边并继续

    如果num[m]比左右两边都小,那么左右两边都肯定有极值,随便砍掉一半并继续

     

    代码:

     1 int findPeakElement(const vector<int> &num) {
     2   int l = 0;
     3   int r = num.size() - 1;
     4 
     5   while (l <= r) {
     6     int m = (l + r) / 2;
     7     bool gtLeft = m == 0 || num[m] > num[m - 1];
     8     bool gtRight = m == num.size() - 1 || num[m] > num[m + 1];
     9     if (gtLeft && gtRight)
    10       return m;
    11     if (gtLeft)
    12       l = m + 1;
    13     else
    14       r = m - 1;
    15   }
    16 
    17   return -1;
    18 }
  • 相关阅读:
    Mac Mysql 修改初始化密码
    网址收藏
    Xcode 模拟器复制解决方案
    ios优秀的第三方框架
    CocoaPods第三方库管理工具
    ios网络请求
    java面试宝典
    SQL分表
    FastDFS+Nginx+Module
    分布式文件系统FastDFS架构认知
  • 原文地址:https://www.cnblogs.com/boring09/p/4248131.html
Copyright © 2011-2022 走看看