448.找到所有数组中消失的数字

发布时间 2023-04-05 15:33:01作者: huangxk23

找到所有数组中消失的数字

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

示例 1:

输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]
示例 2:

输入:nums = [1,1]
输出:[2]

提示:

n == nums.length
\(1 <= n <= 10^5\)
1 <= nums[i] <= n
进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:哈希表

使用哈希表统计元素出现的次数。

code

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        int n = nums.size();

        vector<int> cnt(n + 1,0);

        for(auto item : nums) cnt[item]++;

        vector<int> ans;
        for(int i = 1;i <= n;i ++)
            if(cnt[i] == 0) ans.push_back(i);

        return ans;
    }
};

解题思路2:原地算法

见注释

code

class Solution {
public:
    //原地算法
    //以数组下标作为统作用(1-n)
    //遍历数组,元素对应的下标置为负数
    //最后数组中任然是正数的下标就是缺失的元素
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        
        for(int i = 0;i < nums.size();i ++)
        {
            int position = abs(nums[i]) - 1;

            if(nums[position] > 0) nums[position] = - nums[position];
            else continue;
        }

        vector<int> ans;

        for(int i = 0;i < nums.size();i ++)
        {
            if(nums[i] > 0) ans.push_back(i+1);
        }

        return ans;
    }
};