剑指offer——— JZ6、旋转数组的最小数字

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

示例1

输入

[3,4,5,1,2]

返回值

1

解题思路

比如: 7 8 9 1 2 3 4 5 6 这个数组,你会发现,(中间元素)2<6(最右边元素);由此可得最小值位于最左边元素到中间元素这个范围。

比如:4 5 6 7 8 9 1 2 3 这个数组,你会发现,(中间元素)8>3(最右边元素);由此可得最小值位于中间元素到最右边元素这个范围。

最坏情况是顺序的:1 2 3 4 5 6 7 8 9 我们找寻的范围是 “1 2 3 4 5----->1 2 3--->1 2” 然后比较12发现1更小。

借助二分查找,搜索的终止条件是left与right相邻,可以把时间复杂度降为logn。

代码

function minNumberInRotateArray(rotateArray)
{
    if(rotateArray.length==0){
        return 0;
    }
    let leftindex=0,rightindex=rotateArray.length-1;
    let centerindex=parseInt((leftindex+rightindex)/2);
    let min;
    while(leftindex+1!=rightindex){
        if(rotateArray[centerindex]<rotateArray[rightindex]){
            rightindex=centerindex;
            centerindex=parseInt((leftindex+rightindex)/2);
        }
        else{
            leftindex=centerindex;
            centerindex=parseInt((leftindex+rightindex)/2);
        }
        min=Math.min(rotateArray[leftindex],rotateArray[rightindex]);
    }
    min=Math.min(rotateArray[leftindex],rotateArray[rightindex])
    return min;
}

运行环境:JavaScript (V8 6.0.0)

运行时间:94ms

占用内存:10876KB

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值