题目要求:这道题其实很难,因为他给的要求:算法时间复杂度为O(n),只能用常量级空间思路:缺失数必须在[1,n+1]其中n为数组长度+1遍历数组,将所有大于0的数放在元素-1的位置,比如[1,2,0]这个数组,将1换成nums[0],and2和nums[1]交换完成后,找到第一个下标不是该元素减一的元素,返回。如果不存在则返回n+1,其中n为数组长度+1。核心代码:#遍历数组foriinrange(len(nums)):#如果元素大于0,则取值元素小于等于数组长度,表示也在数组应该排序的范围内#满足前两项,当前元素不下标为当前元素-1position,交换这个元素到元素值-1的位置whilenums[i]>0andnums[i]<=len(nums)andnums[nums[i]-1]!=nums[i]:nums[nums[i]-1],nums[i]=nums[i],nums[nums[i]-1]#排序后,遍历数组,发现第一个元素的下标不存在返回该元素的第一个元素minusoneforiinrange(len(nums)):ifnums[i]!=i+1:returni+1#如果没有找到,返回数组的长度+1(没有找到,如果array为3,表示此时数组为[1,2,3],第一个缺失的正整数为4)returnlen(nums)+1完整代码:classSolution(object):deffirstMissingPositive(self,nums):""":typenums:List[int]:rtype:int"""foriinrange(len(nums)):whilenums[i]>0andnums[i]<=len(nums)andnums[nums[i]-1]!=nums[i]:nums[nums[i]-1],nums[i]=nums[i],nums[nums[i]-1]打印numsforiinrange(len(nums)):ifnums[i]!=i+1:returni+1returnlen(nums)+1
