这道题其实难在他给的要求说明:算法的时间复杂度为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