算法:管窥算法-查找旋转数组(即进行了左移或右移的数组)的最小值

题目是要求找出有序数组旋转后(左移或右移)的最小值在哪里了。如上面例子的最小值为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.如果有重复元素。怎么做?有空完成。

原文地址:https://www.cnblogs.com/minconding/p/10453336.html