旋转数组的最小数字

思路:

方法一:暴力解法

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

方法二:二分法

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]){
          //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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容