這道題其實難在他給的要求說明:算法的時間複雜度爲O(n),而且只能用常數級別的空間算法
思路:數組
遍歷數組,把全部大於0的數放在元素-1的位置上spa
# 遍歷數組 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