LeetCode 41 [First Missing Positive]

原題

給出一個無序的正數數組,找出其中沒有出現的最小正整數。

如果給出 [1,2,0], return 3 如果給出 [3,4,-1,1], return 2
只允許時間復雜度O(n)的算法,并且只能使用常數級別的空間。

解題思路

  • 類似于桶排序的思路,對于每一個整數,我們按照一定的規則放到相應的位置上,最后再去檢查如果指定位置的數不存在,即為沒有出現的最小正整數
  • 規則:1放在array[0],2放在array[1],以此類推
    對于[3, 4, -1, 1],運行最終結果為[1, -1, 3, 4]所以檢查到array[1]時,2不存在,2即為沒有出現的最小正整數
  • 注意,遍歷數組是,對于每一位要while循環至該位置的數字放到正確的位置為止
while nums[i] <= len(nums) and nums[i] > 0 and nums[nums[i] - 1] != nums[i]:
    nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]

完整代碼

class Solution(object):
    def firstMissingPositive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 1
            
        for i in range(len(nums)):
            while nums[i] <= len(nums) and nums[i] > 0 and nums[nums[i] - 1] != nums[i]:
                nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
        
        for i in range(len(nums)):
            if nums[i] != i + 1:
                return i + 1
        return len(nums) + 1
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容