旋转数组的最小数字

思路:

方法一:暴力解法

遍历整个数组找到小值,但是没有利用到排序数组的特点;复杂度o(n)

方法二:二分法

旋转数组的最小数字_第1张图片
Paste_Image.png

以上图为例首先用两个指针p1,p2分别指向数组的首尾端,首先找到中间元素5,因为5大于p1指向的元素,所以中间元素5肯定位于第一个递增子数组中,并且最小的元素一定在它后面,所以把指针p1指向中间元素,在此找到中间元素(1),因为1小于5,而且也小于p2指向的元素,所以1一定位于第二个递增子数组中,并且最小元素一定在它前面或者就是它本身。
需要考虑的问题:(1)起始元素=尾部元素=中间元素的(2)元素有序。

public int minNumberInRotateArray(int [] array){
       if(array==null||length<0)
            return -1;
       int left=0;
       int right=array.length-1;
       int mid=0;
       while(array[right]array[left],则为有序
          if(right-left==1){
             mid=right;//只有两个元素
             break;
          }
          mid=(left+right)/2;
          if(array[left]==array[right]&&array[left]==array[mid])
             return MinOrder[array,left,right];
          if(array[left]<=array[mid])
            left=mid;
          else  if(array[right]>=array[mid])
           right=mid;
       }
           return array[mid];
}
int MinInOrder(int [] array,int left,int right){
       int result=0;
       for(int i=left;i<= right;i++){
             if(result>array[i])
                 result=array[i];
       }
      return result;
}

你可能感兴趣的:(旋转数组的最小数字)