📌  相关文章
📜  到每个数组索引的最小缺失非负整数(1)

📅  最后修改于: 2023-12-03 15:07:16.622000             🧑  作者: Mango

找到每个数组索引的最小缺失非负整数

给定一个整数数组,找到每个数组索引的最小缺失非负整数。

例如,对于数组 [3, 5, -1, 1],索引 0 的最小缺失非负整数是 0,索引 1 的最小缺失非负整数是 4,索引 2 的最小缺失非负整数是 0,索引 3 的最小缺失非负整数是 2

解决方案
第一步

遍历数组,将所有负数和零全部改为 len(nums),将大于等于数组长度的数改为 0

for i in range(len(nums)):
    if nums[i] <= 0:
        nums[i] = len(nums)
    elif nums[i] >= len(nums):
        nums[i] = 0
第二步

遍历数组,使用当前数字作为索引,将对应索引位置的数字取相反数。如果已经是负数,则不重复修改。

for i in range(len(nums)):
    index = abs(nums[i])
    if index != len(nums):
        nums[index] = -abs(nums[index])
第三步

再次遍历数组,找到第一个正数的索引即可,该索引为最小缺失非负整数。如果数组中所有数字均为负数,则返回数组长度。

for i in range(1, len(nums)):
    if nums[i] > 0:
        return i
if nums[0] > 0:
    return 1
else:
    return len(nums)
完整代码
def find_min_missing(nums):
    for i in range(len(nums)):
        if nums[i] <= 0:
            nums[i] = len(nums)
        elif nums[i] >= len(nums):
            nums[i] = 0
    for i in range(len(nums)):
        index = abs(nums[i])
        if index != len(nums):
            nums[index] = -abs(nums[index])
    for i in range(1, len(nums)):
        if nums[i] > 0:
            return i
    if nums[0] > 0:
        return 1
    else:
        return len(nums)
测试
assert find_min_missing([3, 5, -1, 1]) == 0
assert find_min_missing([1, 2, 0]) == 3
assert find_min_missing([7, 8, 9, 11, 12]) == 1