当前位置: 首页 > article >正文

【C++刷题】力扣-#448-找到所有数组中消失的数字

题目描述

给你一个含 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]

题解

这个问题可以通过一次遍历来解决,使用数组的索引作为标志位来标记已经出现过的数字。

  1. 遍历数组:遍历整数数组 nums。
  2. 标记数字:对于每个数字 num,通过将 nums[num - 1] 的绝对值取反来标记该数字已经出现过。如果该位置已经是负数,说明该数字已经标记过,因此是出现两次的数字。
  3. 收集结果:再次遍历数组,收集所有出现两次的数字。

代码实现

vector<int> findDisappearedNumbers(vector<int>& nums) {
    vector<int> result;
    for (int num : nums) {
        int index = abs(num) - 1;
        if (nums[index] >= 0) {
            nums[index] = -nums[index];
        }
    }
    for (int i = 0; i < nums.size(); ++i) {
        if (nums[i] > 0) {
            result.push_back(i + 1);
        }
    }
    return result;
}

复杂度分析

● 时间复杂度:O(n),其中 n 是数组 nums 的长度。我们需要遍历一次数组来标记数字,再遍历一次来收集结果。
● 空间复杂度:O(1),因为我们只使用了常数个额外变量。
这个算法的优势在于它不需要额外的存储空间,并且时间效率较高。


http://www.kler.cn/a/370566.html

相关文章:

  • LINUX 内核设计于实现 阅读记录(2025.01.14)
  • 递归40题!再见递归
  • mysql8.0 重要指标参数介绍
  • 代码随想录算法训练营第三十五天-动态规划-01背包(二维)
  • Mysql常见问题处理集锦
  • vite工程化
  • 关于整理EACO地球链500个问答0.1的建议,请用数字1-500列出来,谢谢20241028。
  • 使用Django框架开发企业级Web应用
  • NUUO网络视频录像机upload.php任意文件上传漏洞复现
  • 边缘计算网关在储能领域的应用-天拓四方
  • 【对比学习】正交阵/酉矩阵,对称矩阵/Hermite矩阵,正交相似对角化/奇异值分解的内在联系
  • 部署DNS主从服务器
  • go.mod 与go.sum作用
  • CSS进阶
  • HarmonyOS 组件样式@Style 、 @Extend、自定义扩展(AttributeModifier、AttributeUpdater)
  • 再识用户中心
  • Log4Net配置详解及输出自定义消息类示例代码
  • VSCode 中拼写检查排除某些单词
  • DiskMirror TCP服务器与客户端的使用
  • poi处理excel文档时,与lombok的@Accessors(chain = true)注解冲突
  • 10.24.2024刷华为OD C题型(四) -- 对象list按照多个属性排序
  • Python xlrd库介绍
  • 双十一宠物空气净化器应该怎么选?自用适合养宠物家庭的空气净化器推荐
  • python数据处理常用操作
  • ArrayList简单的洗牌算法
  • C++Socket通讯样例(服务端)