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

 

posted @ 2019-01-10 14:29  Cloud.9  阅读(116)  评论(0编辑  收藏  举报