美文网首页
面试题11: 旋转数组的最小数字

面试题11: 旋转数组的最小数字

作者: hxy159 | 来源:发表于2019-10-11 09:35 被阅读0次

    题意:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组的最小元素。数组可能包含重复项。

    算法:二分

    思路:由于存在重复元素,数组开头和末尾可能会有形同元素,因此我们将数组末尾与开头的相同元素删去,为了可以用二分找最小值。

    时间复杂度:O(n)

    int findMin(vector<int>& nums) {
        int n = nums.size() - 1;
        if(n < 0) return -1;
        // 将数组末尾与开头相同的数字删去,便于应用二分性质
        while(n > 0 && nums[n] == nums[0]) n --;
        // 如果末尾大于等于开头的数字,说明数组是单调的,nums[0]即为最小值
        if(nums[n] >= nums[0]) return nums[0];
        int left = 0, right = n;
        while(left < right)
        {
            int mid = (left + right) / 2;
            if(nums[mid] < nums[0]) right = mid;
            else left = mid + 1;
        }
        return nums[left];
    }
    

    相关文章

      网友评论

          本文标题:面试题11: 旋转数组的最小数字

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