📌  相关文章
📜  国际空间研究组织 | ISRO CS 2018 |问题 3(1)

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

国际空间研究组织 | ISRO CS 2018 | 问题 3

题目描述

给定一个大小为n的未排序数组,其中包含从1到n的整数,但其中某些整数可能重复出现多次。编写一个函数来查找数组中缺失的数字,并以升序列出它们。

输入

一个数组,其中包含n个整数,1≤a[i]≤n

输出

一个数组,其中包含升序列出数组中缺失的数字。

示例输入
[4, 3, 2, 7, 8, 2, 3, 1]
示例输出
[5, 6]
解题思路

本题要求找出未出现在给定数组中的数字,可以考虑将给定数组中的每个数字对应到一个新的数组中,如果这个数字已经出现,则将这个数字在新数组中对应的位置设为1。最后,遍历新数组,将所有值为0的位置对应的下标(即未出现的数字)加入结果数组中即可。

代码实现

以下是Python的代码实现,时间复杂度为O(n):

def find_disappeared_numbers(nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    n = len(nums)
    res = []
    for i in range(n):
        index = abs(nums[i]) - 1
        if nums[index] > 0:
            nums[index] = -nums[index]
    for i in range(n):
        if nums[i] > 0:
            res.append(i + 1)
    return res

以下是Java的代码实现,时间复杂度同样为O(n):

public List<Integer> findDisappearedNumbers(int[] nums) {
    List<Integer> res = new ArrayList<>();
    for (int i = 0; i < nums.length; i++) {
        int index = Math.abs(nums[i]) - 1;
        nums[index] = -nums[index];
    }
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] > 0) {
            res.add(i + 1);
        }
    }
    return res;
}
总结

本题利用了桶排序的思想,将出现的数字对应到数组中,并将已经出现的数字在数组中的位置设为负数,最后遍历一遍数组,找出所有值为正数的位置即为未出现的数字。时间复杂度为O(n)。