LeetCode 41 [First Missing Positive]

原题

给出一个无序的正数数组,找出其中没有出现的最小正整数。

如果给出 [1,2,0], return 3 如果给出 [3,4,-1,1], return 2
只允许时间复杂度O(n)的算法,并且只能使用常数级别的空间。

解题思路

  • 类似于桶排序的思路,对于每一个整数,我们按照一定的规则放到相应的位置上,最后再去检查如果指定位置的数不存在,即为没有出现的最小正整数
  • 规则:1放在array[0],2放在array[1],以此类推
    对于[3, 4, -1, 1],运行最终结果为[1, -1, 3, 4]所以检查到array[1]时,2不存在,2即为没有出现的最小正整数
  • 注意,遍历数组是,对于每一位要while循环至该位置的数字放到正确的位置为止
while nums[i] <= len(nums) and nums[i] > 0 and nums[nums[i] - 1] != nums[i]:
    nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]

完整代码

class Solution(object):
    def firstMissingPositive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 1
            
        for i in range(len(nums)):
            while nums[i] <= len(nums) and nums[i] > 0 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
        return len(nums) + 1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容