首页 > 其他分享 >力扣-448. 找到所有数组中消失的数字

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

时间:2024-04-25 15:00:13浏览次数:27  
标签:448 num nums int 复杂度 力扣 vector 数组

1.题目

题目地址(448. 找到所有数组中消失的数字 - 力扣(LeetCode))

https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array/

题目描述

给你一个含 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 <= 105
  • 1 <= nums[i] <= n

进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。

2.题解

2.1 哈希表

思路

哈希表存储所有出现过的数即可

代码

  • 语言支持:C++

C++ Code:


class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        int n = nums.size();
        unordered_map<int, int> mp;
        for(int num: nums){
            if(mp.count(num)){
                mp[num]++;
            } else{
                mp.emplace(num, 1);
            }
        }

        vector<int> ans;
        for(int i = 1; i <= n; i++){
            if(!mp.count(i)){
                ans.push_back(i);
            }
        }
        return ans;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)

2.2 索引-值

思路

这里比如像某个1-n的数出现了, 我们可以另外用一个数组,一个哈希表来存储他的出现信息;
那我们是否能使用原数组nums来存储出现过数组的信息呢?
注意到数组下标在0-(n-1)中浮动,而数的值为 1-n, 那我们可不可以用数组下标记录所有出现过的值呢?该使用什么标记呢?
我们这里考虑到所有出现的数都在1-n, 如果某个数 i 出现了, 那我们就令nums[i-1] += n, 使其超出n(进行了标记), i-1是因为数和下标差值为1

为何如此标记呢? 因为我们后面还需要用到 nums[i]的值, 就需要还原它, 如何还原呢?
对于所有nums[i] ∈ [1,n], 如果有被标记的数,也就是多了一个n; 如果理解为绕圈,也就是多绕了一圈回来, 对于绕圈问题, 我们直接 % n 即可解决
这也是我们为何选择 +n 而不是选择加其他值的原因

如何判断是否被标记了呢?
在下一次遍历数组时,找到所有值 <= n 的nums[i]即可, 对应的数即为 下标 + 1 = i + 1

代码

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        int n = nums.size();
        for(int i = 0; i < n; i++){
            int x = (nums[i] - 1) % n;
            nums[x] += n; // 用索引0-(n-1)存储出现过的1-n的数, 差值为1
        }

        vector<int> ans;
        for(int i = 0; i < n; i++){
            if(nums[i] <= n && nums[i] >= 1){
                ans.push_back(i + 1); // 索引和实际值差1 
            }
        }
        return ans;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)

标签:448,num,nums,int,复杂度,力扣,vector,数组
From: https://www.cnblogs.com/trmbh12/p/18157733

相关文章

  • php几个数组的奇淫巧计
    使用array_map()应用函数到数组的每个元素。$numbers=[1,2,3,4,5];$squares=array_map(function($number){return$number*$number;},$numbers);//$squares=[1,4,9,16,25]使用array_filter()过滤数组中的元素。$numbers=[1,2,3,4,5];$o......
  • C++数组的连续性
    虚拟上连续,物理上大概率连续,除非不在同一个物理页上,并且物理页不连续时数组在物理地址空间是否连续,对于用户空间的程序是不需要关心的。另外,对于一个抽象层次很高的编程语言,数组是不是一定要保证虚拟地址空间连续,感觉也是可以研究的。例如,java的数组就不连续?所以array到底是在......
  • 力扣-645. 错误的集合
    1.题目介绍题目地址(645.错误的集合-力扣(LeetCode))https://leetcode.cn/problems/set-mismatch/题目描述集合s包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合丢失了一个数字并且有一个数字重复。......
  • 力扣-697. 数组的度
    1.题目介绍题目地址(697.数组的度-力扣(LeetCode))https://leetcode.cn/problems/degree-of-an-array/题目描述给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在nums中找到与 nums 拥有相同大小的度的最短......
  • 第三章 字符串、向量和数组
    当用+连接string对象和字符串字面值的时候,必须确保有一个操作数是string对象。头文件包含字符处理相关函数使用范围for循环实际上是在使用迭代器循环,所以不能再循环里改变容易容量或执行让迭代器失效的操作。数组的名字在很多情况下会转换成指针,auto会推导出指针,但是decltype还......
  • 力扣-396. 旋转函数
    1.题目介绍题目地址(396.旋转函数-力扣(LeetCode))https://leetcode.cn/problems/rotate-function/题目描述给定一个长度为n的整数数组 nums 。假设 arrk 是数组 nums 顺时针旋转k个位置后的数组,我们定义 nums 的旋转函数  F 为:F(k)=0*arrk[0]+1*......
  • 力扣-189. 轮转数组
    1.题目题目地址(189.轮转数组-力扣(LeetCode))https://leetcode.cn/problems/rotate-array/题目描述给定一个整数数组nums,将数组中的元素向右轮转k 个位置,其中 k 是非负数。 示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步......
  • 笔记/C++中的数组排序
    在C++中,std::sort函数是一个用于对容器(如数组、向量等)进行排序的通用算法。它定义在<algorithm>头文件中,并接受两个迭代器参数,分别指向要排序的范围的开始和结束位置。此外,std::sort还可以接受一个可选的比较函数或lambda表达式,用于自定义排序规则。以下是std::sort函数的基本用......
  • C 数组
    创建数组数组是一组相同类型的值,按照顺序储存在一起。数组通过变量名后加方括号表示,方括号里面是数组的成员数量。intarr[100];上面示例声明了一个数组arr,里面包含100个成员,每个成员都是int类型。注意,声明数组时,必须给出数组的大小。数组的成员从0开始编号,所以数组arr[100]......
  • 数组处理,去重&合并相同key的值
    背景:上游返回的skuIdList存在相同的Id,skuCount数组与skuID一一对应处理结果:skuIdList去重,对应的count总和要加起来,对应的originalPriceList和subtotalPriceList不变代码:importgroovy.json.JsonSlurperdefskuIdList=newJsonSlurper().parseText('["472262851","472......