[东哥的leetcode刷题日记] leetcode 153 :Find Minimum in Rotated Sorted Array

leetcode 153 :Find Minimum in Rotated Sorted Array


题目链接: https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
难度: 中等
归类 : 数组操作, 二分查找, 双指针

题目:

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

示例:

示例 1:
输入: [3,4,5,1,2]
输出: 1
示例 2:
输入: [4,5,6,7,0,1,2]
输出: 0


解法:

今天开始转到leetcode上而不是在力扣上做题,感觉leetcode上的解法更好一些。
本题主要使用c++进行了解答,以及经典题解和尝试改进的最优/最简洁解法。


个人解法

c++解法(双指针+二分查找)

本题可以直接一次for循环遍历求最小值,时间复杂度为O(N),但是就遗失掉有序数组这个关键信息。
本题可以使用双指针法+二分查找法来解决。与之前的有序数组二分查找不同的是,本题的有序数组是在未知点旋转过的,即将某个未知点的前半部分接到了数组的尾巴上。
因此设置双指针,start=0,end=len-1,mid=start+(end-satrt)/2。
注意二分查找的判断条件为:
如果nums[mid]>nums[start],说明拐点是mid或者在mid后面,则令start=mid;
如果nums[mid] < nums[end],说明拐点在mid或者在mid前面,则令end=mid;
循环的截止条件为当start和end相邻,即end-start=1时。 此时拐点必为二者之一,此时只需返回二者之中最小值即可。
小窍门: 在最开始,判断数组首值和末值的关系,如果首值小于末值,说明数组没有旋转,直接返回首值即可。

#c++解法
class Solution {
public:
    int findMin(vector& nums) {
        int len = nums.size();
        if(len < 2) return nums[0];
        if(nums[0] < nums[len - 1]) return nums[0];
        int start = 0, end = len - 1, mid;
        while(end - start > 1){
            mid = start + (end - start) / 2;
            if(nums[mid] > nums[start]) start = mid;
            else if(nums[mid] < nums[end]) end = mid;
        }
        return nums[start] < nums[end] ? nums[start] : nums[end];
    }
};

时间复杂度: O(logN)
空间复杂度: O(1)
提交结果:
Runtime: 4 ms, faster than 72.55% of C++ online submissions for Find Minimum in Rotated Sorted Array.
Memory Usage: 10.5 MB, less than 6.67% of C++ online submissions for Find Minimum in Rotated Sorted Array.


题解优解

python解法(二分查找)

貌似没有更优算法,放上一个python版本的

class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1
        while nums[left] > nums[right]:
            middle  = (left + right) // 2
            if nums[middle] < nums[right]:
                right = middle
            else:
                left = middle + 1
        return nums[left]

时间复杂度: O(logN)
空间复杂度: O(1)
提交结果:
Runtime: 44 ms, faster than 38.03% of Python3 online submissions for Find Minimum in Rotated Sorted Array.
Memory Usage: 13.8 MB, less than 6.00% of Python3 online submissions for Find Minimum in Rotated Sorted Array.


尝试改进的最优解法

本题使用上述时间复杂度为log(N)的解法最优,能够充分利用有序数组的条件。

你可能感兴趣的:(东哥的leetcode刷题日记)