[東哥的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<int>& 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)的解法最優,能夠充分利用有序數組的條件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章