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

lc hot 100之:找到所有数组中消失的数字

这题的直接思路是哈希表(又又又是哈希表哈哈哈)但是这样的话就要新建空间,不能保证o(1)的空间复杂度。

哈希表长度为n,这个数组长度也为n,所以想能不能原地修改?

因此面临的问题是:

1、如何在原数组标识已访问?

2、 如果修改了原数组,如何最后判断原值?

可以这样想:如果1-n数是满的,那么对应数组序号是0-n-1,对吧?

因此如果数num[i]存在,我们修改其对应的序号num[i]-1,即nums[(nums[i]-1)]。

修改的方式有多种,我们将其自增n,表明已访问。

最后,找到nums数组中数字仍在1-n的序号对应的数,表示这个数没有访问过,是不存在的,将他添加到结果数组里。

卡点可能在于对nums数组的想象,希望大家可以抽象的把他看成既是一个hash表,又是他本身。(有点难哈哈哈

这才是本题的精髓。

代码:

class Solution {
public:vector<int> findDisappearedNumbers(vector<int>& nums) {vector<int> res;int n=nums.size();// sort(nums.begin(),nums.end());for(int i=0;i<n;i++){nums[(nums[i]-1)%n]+=n;}for(int i=0;i<n;i++){if(nums[i]<=n)res.push_back(i+1);}return res;}
};

有一个数据报错了:

可以把+n的那一行改一下,只有没加过的数再+n,避免重复加溢出。

修改后代码:

class Solution {
public:vector<int> findDisappearedNumbers(vector<int>& nums) {vector<int> res;int n=nums.size();// sort(nums.begin(),nums.end());for(int i=0;i<n;i++){if(nums[(nums[i]-1)%n]<=n)nums[(nums[i]-1)%n]+=n;}for(int i=0;i<n;i++){if(nums[i]<=n)res.push_back(i+1);}return res;}
};

http://www.xdnf.cn/news/662833.html

相关文章:

  • SQL:合并查询(UNION)
  • DL00347-基于人工智能YOLOv11的安检X光危险品刀具检测含数据集
  • 报文完整性与数字签名
  • 【修电脑的小记录】打不开某个网站
  • Linux `ls` 命令深度解析与高阶应用指南
  • Mysql数据库之日志与备份
  • 论坛系统自动化测试实战
  • SpringAI--RAG知识库
  • Windows中安装Neo4j图数据库的配置
  • 数据架构:零售业数字化转型的“隐形引擎”
  • 什么是软件验收测试,出验收测试报告的软件检测机构推荐
  • MySQL问题:数据库有哪些存储引擎,它们有什么区别?
  • Jenkins部署
  • 小型电磁脉冲干扰(EMP)的原理及组成
  • L1-111 大幂数 - java
  • day37打卡
  • 二、网络安全常见编码及算法-(1)
  • 爱芯元智芯片推理cn-clip
  • 11.10 LangGraph状态管理实战:Reducers模式如何重塑企业级多节点协作?
  • 云化全场景+AI智算双擎驱动,打造高教数智化转型新范式,麒麟信安闪耀第63届高等教育博览会!
  • Linux基础IO----动态库与静态库
  • MQTT 在云平台与设备通讯中的连接特性与通讯性质深度解析
  • 网络原理与 TCP/IP 协议详解
  • AJAX-让数据活起来(一):入门
  • 深度PCB干货:如何画出做好一块电路PCB板
  • YOLO 算法详解:实时目标检测的里程碑
  • 【unity游戏开发——编辑器扩展】Scene窗口拓展
  • ZYNQ实战:可编程差分晶振Si570的配置与动态频率切换
  • Powershell实现服务守护进程功能(服务意外终止则重启)
  • 湖北理元理律师事务所债务优化服务中的“四维平衡“之道