Leetcode41. 缺失的第一個正數

  • 題目要求:

image.png
這道題其實難在他給的要求說明:算法的時間複雜度爲O(n),而且只能用常數級別的空間算法

  • 思路:數組

    • 缺失的數字必定在[1,n+1]的範圍中,n爲數組長度+1
    • 遍歷數組,把全部大於0的數放在元素-1的位置上spa

      • 好比[1,2,0]這個數組,把1與nums[0]交換,把2與nums[1]交換
    • 都交換完畢後,找到元素的下標不爲元素減一的第一個元素,返回他
    • 若是沒有,返回n+1,n爲數組長度+1
  • 核心代碼:
# 遍歷數組
for i in range(len(nums)):
    #若是該元素大於0,並且該元素的值小於等於數組長度,說明他也在數組應該排序的範圍裏
    #前兩項都知足,並且當前元素不在下標爲當前元素-1的位置,把這個元素交換到元素值-1的位置去
    while nums[i] > 0 and nums[i] <= len(nums) 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
# 若是沒找到,返回數組長度+1(沒找到,若是數組長度爲3,說明此時數組爲[1,2,3],則缺失的第一個正整數爲4)
return len(nums) + 1
  • 完整代碼:
class Solution(object):
    def firstMissingPositive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        for i in range(len(nums)):
             while nums[i] > 0 and nums[i] <= len(nums) and nums[nums[i]-1] != nums[i]:
                nums[nums[i]-1] , nums[i] = nums[i] , nums[nums[i]-1]
        print nums
        for i in range(len(nums)):
            if nums[i] != i + 1:
                return i + 1

        return len(nums) + 1
相關文章
相關標籤/搜索