zoukankan      html  css  js  c++  java
  • 寻找峰值

    http://www.lintcode.com/zh-cn/problem/find-peak-element/

    注意点:以mid的位置为分类条件,波峰,上升下降,波谷,从而不会遗漏什么情况。

        设置区间长度为3比较好

     1 public int findPeak(int[] A) {
     2     if(A == null || A.length == 0) return -1;
     3     int start = 0, end = A.length - 1;
     4     //先找左上升区间,再找右下降区间,不可行,设置区间长度为3试试
     5     while(end - start > 1) {
     6         int mid = start + (end - start) / 2;
     7         if(A[mid] > A[mid -1] && A[mid] > A[mid + 1]) return mid;
     8         if(A[mid] > A[mid -1])`{
     9             start = mid;
    10         } else {
    11             end = mid;
    12         }
    13     }
    14     //其实可能数组越界的,所以还是区间长度为3靠谱,也可以判断下start -1, end+ 1是否越界,
    15     //不越界就判断下面if,否则少一个判断条件
    16     
    17     if(A[start] > A[start -1] && A[start] > A[end]) return start;
    18     if(A[end] > A[start] && A[end] > A[end + 1]) return end;
    19     
    20 }
    21 public int findPeak(int[] A) {
    22     if (A ==null || A.length == 0) {
    23         return -1;
    24     }
    25     int start = 0; int end = A.length - 1; int mid;
    26     while (end - start > 2) {
    27         mid = start + (end - start) / 2;
    28         if(A[mid] > A[mid -1] && A[mid] > A[mid + 1]) {  //mid是波峰
    29             return mid;  
    30         } else if(A[mid] > A[mid -1] && A[mid] < A[mid + 1]) { //mid是上升沿
    31             start = mid;
    32         } else { //mid是下降沿或者波谷
    33             end = mid;
    34         }
    35     }
    36     mid = start + (end - start) / 2;
    37     if (A[mid] > A[start] && A[mid] > A[end]) {
    38         return mid;
    39     } else {
    40         return -1;
    41     }
    42 }
    View Code
  • 相关阅读:
    洛谷P2640 神秘磁石(欧拉筛法)
    并查集
    高精度算法
    手写堆
    对拍的使用
    unity4.6学习Ugui中文文档-------参考-UGUI Rect Transform
    使用c#访问脚本里变量的方法
    Unity3d 脚本相互调用
    set_union的几个例子[转]
    C++ 关键字——friend
  • 原文地址:https://www.cnblogs.com/ddcckkk/p/6806297.html
Copyright © 2011-2022 走看看