python每日一题——17缺失的第一个正数

题目

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
示例 3:
输入:nums = [7,8,9,11,12]
输出:1

答案

要解决这个问题,我们可以使用一种称为 “桶排序” 的算法,但稍作修改以适应我们的需求。桶排序通常用于对一个范围内的数字进行排序,但在这里,我们只关心最小的正整数,因此我们可以将桶的数量减少到只有一个。

解题思路:

  1. 遍历数组,将所有的负数、零和小于等于当前最大正数的正数都替换为最大正数+1。这样做的目的是确保所有剩余的数字都是正整数且没有重复。
  2. 遍历完成后,当前的最大正整数就是结果。

代码实现:

def firstMissingPositive(nums):
    if not nums:
        return 1
    
    max_num = max(nums)
    # 将所有负数和0替换为最大正数+1
    for i in range(len(nums)):
        if nums[i] <= 0:
            nums[i] = max_num + 1
    # 将小于等于当前最大正数的正数替换为最大正数+1
    for i in range(len(nums)):
        if nums[i] > 0 and nums[i] <= max_num:
            nums[i] = max_num + 1
    
    # 遍历完成后,当前的最大正整数就是结果
    return max_num + 1

这个算法的时间复杂度是O(n),因为我们只遍历了数组两次。另外,它只需要常数级别的额外空间,因为我们只使用了几个额外的变量。

你可能感兴趣的:(算法练习,python,算法,leetcode)