查找(时间复杂度; 二分法)

来源:互联网 发布:linux关闭tomcat报错 编辑:程序博客网 时间:2024/06/07 01:05


package Day52;
//因为最近开始做项目时间就显得很紧张了,停了一个礼拜了快,有点儿偷懒了

/*把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,
该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。*/

public class Test {

 public static void main(String[] args) {
  // TODO Auto-generated method stub

 }
//最笨的一种方法,也是最先找到的,遍历然后找到最小值
   public int minNumberInRotateArray(int [] array) {
    int min=1000000;
    if(array.length==0)
    {
     return 0;
    }else
    {
     for(int i=0;i<array.length;i++)
     {
      if(array[i]<min)
      {
       min=array[i];
      }
     }
    }
    return min;
    }
//稍微优化一点的方法,明白题意
 public int minNumberInRotateArray1(int [] array) {
 for(int i=0;i<array.length;i++)
 {
  if(array[i+1]<array[i])
  {
   return  array[i+1];
  }
 }
 
  return array[0];
  
 }
//最好的一种方法,利用二分法,使得其时间复杂度最小,为log(n)
 
 public int minNumberInRotateArray2(int [] array) {
       int left=0;
  int right=array.length-1;
  int medin=-1;
  while(array[left]>=array[right])
  {
             if(right-left==1){
                 medin= right;
                 break;//为了跳出循环的条件
             }
           medin=(left+right)/2;
   if(array[medin]>=array[left])//每个条件都要考虑,等号不能丢
   {
    left=medin;
   }
   if(array[medin]<=array[right])
   {
    right=medin;
   }
  }
   return array[medin];

    }


}
 

原创粉丝点击