旋转数组的最小数字

那年仲夏 提交于 2020-01-26 09:39:01

旋转数组的最小数字

1.题目描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。
示例 1:
在这里插入图片描述
示例 2:
在这里插入图片描述

2.思路(二分搜索)

1.如果数组只有一个元素,直接返回nums[begin]。
2.如果nums[end] > nums[begin],说明数组是有序递增的,直接返回nums[begin]。
3.如果mid = begin + (begin + end) / 2到达数组的边界:
(1)nums[mid] > nums[mid + 1],则返回nums[mid + 1]。
(2)num[mid - 1] > nums[mid],则返回nums[mid]。
4.二分搜索:
(1)如果nums[mid] > nums[begin],说明nums[mid]在前面的递增数组中,最小值应该在后面,因此begin = mid + 1。
(2)如果nums[mid] < nums[end],说明nums[mid]在后面的递增数组中,最小值应该在前面,因此end = mid - 1。

3.代码

class Solution {
public:
    int findMin(vector<int>& nums) {
        //如果数组只有一个元素
        if(nums.size() == 1){
            return nums[0];
        }
        int begin = 0;
        int end = nums.size() - 1;
        //如果数组是有序的,返回第一个
        if(nums[end] > nums[begin]){
            return nums[0];
        }
        //二分搜索
        while(begin <= end){
            int mid = begin + (end - begin) / 2;
            //如果mid到达边界,mid是最小值的前一个值
            if(nums[mid] > nums[mid + 1]){
                return nums[mid+1];
            }
            //如果mid到达边界,mid是最小值
            if(nums[mid] < nums[mid - 1]){
                return nums[mid];
            }
            if(nums[mid] > nums[begin]){
                begin = mid + 1;
            }
            else if(nums[mid] < nums[end]){
                end = mid - 1;
            }
        }
        return -1;
    }
};

复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!