旋转数组中的最小数字

题目

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

思路

简单题,不用思路

解答

java 版

方法一:暴力求解
  public int minNumberInRotateArray(int [] array) {
        if(array.length==0){
            return 0;
        }

           int min = 10000;
            for(int i = array.length-1;i>=0;i--){
                min = min<array[i]?min:array[i];
            }

            return min;
}

 显然,如果你用这样的代码去面试,你多半要GG。我们对此代码稍加优化。
方法二  稍加优化
public int minNumberInRotateArray(int [] array) {
        if(array.length==0){
            return 0;
        }

           int size = array.length-1;
            for(int i = 0;i<size;i++){
                if(array[i]>array[i+1])
                {
                    return array[i+1];
                }
            }
            return array[size];
    }
这样 比前面的代码确实是优化了一点,但是效果并不是我们理想中的代码。所以我们还要优化,有注意到我们的的数组是有序的。
方法三 
   public int minNumberInRotateArray(int [] array) {
        if(array.length==0){
            return 0;
        }
        int high = array.length-1;
       int low = 0;
       int mid = low+(high-low)/2;
       while(low<high){
           if(array[low]<array[high]) return array[low];

           mid = low+(high-low)/2;
           if(array[mid]>array[high]){
               low = mid+1;
           }else if(array[mid]<array[high])
           {
               high = mid;   
           }else{
               high --;
           }

       }

       return array[low] ;
    }
中间值得一提的是,当 array[mid]<array[high]时,high 不能等于 mid ,因为如果我们查找的范围只剩两个了{4,6} 
我们 mid 必定指向{4} 如果 此时 ,high = mid-1;答案就错误了。

php 版

方法一
function minNumberInRotateArray($rotateArray)
{
    return min($rotateArray);
}
显然,hr 考你这道题,不是让你用自带的函数的啊。你这样绝壁 pass
方法二
function minNumberInRotateArray($rotateArray)
{
    if(count($rotateArray)==0){
        return 0;
    }
    $high = count($rotateArray)-1;
    $low = 0;
    while($low<$high){
        if($rotateArray[$low]<$rotateArray[$high]) return $rotateArray[$low];
        $mid = (int)($low +($high-$low)/2);

        if($rotateArray[$high]<$rotateArray[$mid]){
            $low = $mid+1;
        }else if($rotateArray[$high]>$rotateArray[$mid]){
            $high = $mid;
        }else{
            $high--;
        }
    }
    return $rotateArray[$low];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值