剑指Offer打卡11.旋转数组的最小数字

Posted 余光、

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer打卡11.旋转数组的最小数字相关的知识,希望对你有一定的参考价值。

剑指Offer(11)旋转数组的最小数字

JavaScript剑指Offer题解

🚀包含数组、对象、链表、堆栈、树等经典题型
☕️每天一道,轻松不累
💬详细的题目解析,收藏方便阅读

在线阅读地址

在线阅读地址

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

示例 1:

输入:[3,4,5,1,2]
输出:1

示例 2:

输入:[2,2,2,0,1]
输出:0

题解一:遍历

思路

  1. 1.顺序遍历,当遇到arr[i+1] < arr[i]时返回arr[i+1],如果遍历一圈都不是的话则是arr[0]
  2. 时间复杂度是O(n)
/**
 * @param {number[]} numbers
 * @return {number}
 */
var minArray = function(numbers) {
    for(let i= 0;i<numbers.length;i++){
        if(numbers[i]>numbers[i+1]){
            return numbers[i+1];
        }
    }
    return numbers[0]
};

题解二:二分法

思路

  1. 排序数组相关,首先想到使用二分法,时间复杂度O(nlogn)
/**
 * @param {number[]} numbers
 * @return {number}
 */
var minArray = function (numbers) {
    let left = 0;
    let right = numbers.length - 1;
    while (left < right) {
        let mid = parseInt((left + right) / 2); //注意js里面需要转化为整数!
        if (numbers[mid] < numbers[right]) {
            // 如果mid < right,证明是单调递增的,拐点在左侧,注意,拐点可能在mid,所以不能mid+1
            right = mid;
        } else if (numbers[mid] > numbers[right]) {
            // 如果mid > right,单调性被破坏,证明拐点在右侧
            left = mid + 1;
        } else { 
            // 如果相等,分辨不出来,删除一位不会影响最终结果
            right--;
        }
    }
    return numbers[left]
};

写在最后

本篇是剑指Offer的第九题,俗话说好的合理的数据结构+算法才是写好代码的关键,不妨跟我一起来吧~

热门开源项目

以上是关于剑指Offer打卡11.旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章

七周打卡剑指offer《旋转数组中最小的数字》

剑指 Offer 11. 旋转数组的最小数字 的详细题解

java刷题-剑指offer 11 旋转数组的最小数字

剑指Offer:旋转数组的最小数字11

剑指 Offer 11. 旋转数组的最小数字暴力二分查找

LeetCode 剑指 Offer 11. 旋转数组的最小数字 | Python