zoukankan      html  css  js  c++  java
  • 算法:管窥算法-查找旋转数组(即进行了左移或右移的数组)的最小值

    题目是要求找出有序数组旋转后(左移或右移)的最小值在哪里了。如上面例子的最小值为0,旋转后,在位置[4]。

    1.暴力法

    初值为[0],遍历数组,从[0]直到到[i]<[0]。T(n)=O(n)

     1 /**
     2  * 查找旋转数组的最小值-暴力法
     3  * @param a
     4  * @return
     5  */
     6     public static int B3(int[] a){
     7         int min=a[0];
     8         for(int i=1;i<a.length;i++){
     9             if(a[i]<min){
    10                 min=a[i];
    11                 break;
    12             }
    13         }
    14         return min;
    15     }

    2.二分法。时间复杂度:可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn)

     1 /**
     2  * 查找旋转数组的最小值-二分法
     3  * @param a
     4  * @return
     5  */
     6     public static int T(int[] a){
     7         int low=0;
     8         int hight=a.length-1;
     9         int mid;
    10         //如果low<hight说明二分没结束,因为至少还有两个值low和hight,所以还要二分。最后low==hight。
    11         while(low<hight){
    12             mid=(low+hight)/2;
    13             //注意这里不要用a[mid]>a[low]进行判断,因为当只有两个值时会出问题,因为这时mid=low,
    14             //应该要用a[mid]>=a[low]或a[mid]<a[hight];
    15             if(a[mid]<a[hight]){//最小值在左半部分
    16                 hight=mid;
    17             }else{
    18                 low=mid+1;
    19             }
    20         }
    21         return a[low];
    22     }

    3.如果有重复元素。怎么做?有空完成。

  • 相关阅读:
    Kostya the Sculptor
    Parade
    zoj 1097 普吕弗序列
    API分析——Jquery UI Dialog
    伸缩性和可用性反模式(转)
    可伸缩性最佳实战(转)
    二叉索引树BIT
    RMQ
    线段树(区间树)
    双栈计算算术表达式
  • 原文地址:https://www.cnblogs.com/minconding/p/10453336.html
Copyright © 2011-2022 走看看