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