lc 41. First Missing Positive
https://leetcode.com/problems/first-missing-positive/
O(1)空间复杂度,找到最小的没有出现在nums中的正整数。
其实算不上严格的swap,因为不用交换,当前的位置上如果不是正确放置的(不是正确放置:nums[i]!=i)那么,就把这个数字放到正确的位置上去,不会有死循环
因为你永远不会重复处理同一个数字
小技巧:
1.强行添加一个0,把问题变成i==nums[i]的问题,否则比较复杂
2.强行添加一个len(nums)+10,保证问题的answer在len(nums)之内。就是避免给你[2,3,4,1]这种答案为5在nums之外的情况
3.while比递归好看
代码:
class Solution: def firstMissingPositive(self, nums): """ :type nums: List[int] :rtype: int """ nums+=[0,len(nums)+10] for i in range(len(nums)): n=nums[i] while 0<=n<len(nums) and n!=nums[n]: next=nums[n] nums[n]=n n=next for i in range(len(nums)): if nums[i]!=i: return i