美文网首页
每日一题——旋转数组的最小数字

每日一题——旋转数组的最小数字

作者: 拉普拉斯妖kk | 来源:发表于2023-07-30 19:30 被阅读0次

    题目


    有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

    数据范围:1≤n≤10000,数组中任意元素的值: 0≤val≤10000

    要求:空间复杂度:O(1) ,时间复杂度:O(logn)

    示例1

    输入:
    [3,4,5,1,2]
    返回值:
    1
    

    示例2

    输入:
    [3,100,200,3]
    返回值:
    3
    

    思路


    二分法:

    • mid = (start + end) / 2 为二分的中间位置。
    • mid,start,right分为三种情况:
      • nums[mid] > nums[end]时, 那么最小值一定在 [mid+1,end]区间中;
      • nums[mid] = nums[end]时,无法判断最小值在哪个区间,所以此时只能缩小end的值;
      • nums[mid] < nums[end]时,那么最小值一定在[start,mid]区间内。

    解答代码


    class Solution {
    public:
        /**
         * @param nums int整型vector 
         * @return int整型
         */
        int minNumberInRotateArray(vector<int>& nums) {
            // write code here
            int start = 0;
            int end = nums.size() - 1;
            while (start != end) {
                int mid = (start + end) / 2;
                if (nums[mid] > nums[end]) {
                    //最小的数字在mid右边
                    start = mid + 1;
                } else if (nums[mid] == nums[end]) {
                    //无法判断,一个一个试
                    end = end - 1;
                } else if (nums[mid] < nums[end]) {
                    //最小数字要么是mid要么在mid左边
                    end = mid;
                }
            }
            return nums[end];
        }
    };
    

    相关文章

      网友评论

          本文标题:每日一题——旋转数组的最小数字

          本文链接:https://www.haomeiwen.com/subject/nxvspdtx.html