剑指offer-旋转数组的最小数字-JavaScript

旋转数组的最小数字

http://www.nowcoder.com/questionTerminal/9f3231a991af4f55b95579b44b7a01ba

【2种解法】【剑指Offer】【JavaScript题解】

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为 1。

NOTE:给出的所有元素都大于 0,若数组大小为 0,请返回 0。

专注前端与算法的系列干货分享,欢迎关注(¬‿¬):
「微信公众号:心谭博客」| xxoo521.com | GitHub

解法 1:暴力法

遍历一次,直接找到比较出最小的数字。

时间复杂度是 O(N),空间复杂度是 O(1)。

// 原文地址:https://xxoo521.com/2019-12-24-xuan-zhuan-shu-zu/
// ac地址:https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

/**
 * @param {number[]} rotateArray
 */
function minNumberInRotateArray(rotateArray) {
    const length = rotateArray.length;
    if (!length) {
        return 0;
    }

    return Math.min(...rotateArray);
}

解法 2: 二分查找

看到这种题目,正确做法基本上都是需要使用二分查找

对于这种变形的二分查找的考察,解决思路主要都是:观察 left、mid、right 三个指针对应的元素的大小关系,然后移动指针。

具体的解决方法主要是:多写几个例子,然后观察如何移动。

举几个例子来推导解题细节(请记住题干的数组有序、某个点旋转这两个条件):

  • arr[left] < arr[right]: 直接返回arr[left]。例如:1 2 3 4 5
  • arr[left] < arr[mid]: 说明从数组下标范围为[left, right]的元素是递增的,此时最小值只可能出现在[mid + 1, length)范围内。例如:4 5 1 2 3
  • arr[mid] < arr[right]: 说明从数组下标范围为[mid, right]的元素是递增的,此时最小值只可能出现在[left, mid] 范围内。注意,这里不能跳过下标mid。例如:3 3 3 4 5
  • 其他情况,此时arr[mid] = arr[right] = arr[left]: 移动 left,缩小范围即可。例如:1 1 1 0 1
// 原文地址:https://xxoo521.com/2019-12-24-xuan-zhuan-shu-zu/
// ac地址:https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

function minNumberInRotateArray(rotateArray) {
    const length = rotateArray.length;
    if (!length) {
        return 0;
    }

    let left = 0,
        right = length - 1;
    while (left < right) {
        let mid = Math.floor((left + right) / 2);

        // 子数组有序
        if (rotateArray[left] < rotateArray[right]) {
            return rotateArray[left];
        }

        // 左子数组有序,最小值在右边
        // 那么mid肯定不可能是最小值(因为rotateArray[mid]大于rotateArray[left])
        if (rotateArray[left] < rotateArray[mid]) {
            left = mid + 1;
            // 右子数组有序,最小值在左边
            // 这里right=mid因为最小值可能就是rotateArray[mid]
        } else if (rotateArray[mid] < rotateArray[right]) {
            right = mid;
        } else {
            // 无法判断,缩小下范围
            ++left;
        }
    }

    return rotateArray[left];
}
全部评论
思路很棒呀,但是第二个例子记错了吧? 然后我和你不同的地方是mid < right就去mid的左边(含mid)找那里,我写的是 mid < left就去mid的左边(含mid)找。但是这样就会报错按你的来就不会错。不知道是什么原因
点赞 回复 分享
发布于 2020-05-14 17:03
第一个例子使用Math.min函数时为啥要加...?大佬求解
点赞 回复 分享
发布于 2021-03-28 14:30

相关推荐

1.&nbsp;事件概述3月10日下午,华为在“心声社区”发布长达6500字通报,曝光72名正式员工及19名非雇员在非雇员招聘中存在徇私舞弊行为,多人出卖公司信息资产获利,引发热议。-&nbsp;“非雇员”一般指华为OD员工,与人力服务公司签劳动合同,以派遣方式到华为工作,薪资待遇与华为内部员工基本一致,可通过考核转正。2.&nbsp;相关传言与真相华为相关人士称暂无官方回应,很多传言细节不准确。&nbsp;华为成都研究所员工透露,此次通报主要涉及成都研究所的数据存储部门,整个数据存储业务约100余人,此次明文通报除名辞退或通报批评的有62名,“很多部门基本全开除”&nbsp;。网传任正非亲赴成都、封楼抓人等消息不实。早在2024年年中,就有...
七安有出处嘛:省流:任正非亲赴成都等消息不实,2024 年年中就有人举报了;涉及36名违规当事人,其中有13人被除名;10人有主动申报情节或情节较严重的,予以辞退处理;另有13人被劝退、个人职级降3等。另外还有26名相关管理责任人作为直接或间接管理者,被处以个人职级降6等,冻结个人涨薪、职级晋升、干部向上任命,冻结期6—12个月不等;若下属违规偶发,则仅通报批评。并没有释放100HC😂😂😂
点赞 评论 收藏
分享
点赞 评论 收藏
分享
剑桥断刀:找啥工作,牛客找个比如大厂软开或者随便啥的高薪牛马,大把没碰过妹子的技术仔,狠狠拿捏爆金币
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务