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


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

算法:二分

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

时间复杂度: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];
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容