LeetCode题目笔记——448. 找到所有数组中消失的数字

news2024/9/27 19:23:23

文章目录

    • 题目描述
    • 题目链接
    • 题目难度——简单
    • 方法一:使用额外空间,字典
      • 代码/Python
      • 代码/C++
    • 方法二:进阶,原地修改
      • 代码/C++
      • 代码/C++
    • 总结

题目描述

这好像是一到经典的面试题

给你一个含 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) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。

题目链接

题目难度——简单

方法一:使用额外空间,字典

  根据题意,一定有1,n之间的数出现次数大于1,而缺失的数出现次数就是0,所以我们使用一个哈希表或者直接用一个数组来当哈希表,统计出现元素的次数,然后再遍历一遍,把没出现的放到答案里。

代码/Python

class Solution:
    def findDisappearedNumbers(self, nums: list[int]) -> list[int]:
        res = []
        count = Counter(nums)
        size = len(nums)
        for i in range(size):
            if count[i + 1] == 0:
                res.append(i + 1)
        
        return res

在这里插入图片描述

代码/C++

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        map<int, int> count;
        vector<int> res;
        for (auto n: nums) {
            count[n] += 1;
        }
        for(int i = 0; i < nums.size(); i++){
            if(count.find(i + 1) == count.end()){
                res.push_back(i + 1);
            }
        }
        return res;
    }
};

方法二:进阶,原地修改

  难的是题目中说到的进阶方法,要做到O(N)时间不使用额外空间,我们只能在原数组上修改。
  可以直接用原数组当做哈希表,第一次遍历,将出现的数x对应下标x-1上的数置为负数,表示x出现过,第二次再遍历,当遇到正数时就说明是i+1没出现过的。
  第二种方式是将出现的数x对应下标x-1上的数加上n,最后没出现的数对应下标上的数就肯定会小于n,再遍历一次统计一下就可以。如果同一个数出现多次,那么算下标的时候可能会溢出,因此要进行一个取余运算。

代码/C++

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

代码/C++

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

在这里插入图片描述

总结

  方法一时间复杂度O(N),空间复杂度O(N), 方法二时间复杂度O(N),空间复杂度O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

遮挡检测--基于角度的遮挡检测方法

文章目录1基于角度的遮挡检测方法2遮挡检测遍历方法2.1方法1--自适应径向扫描方法2.2方法2--螺旋扫描法参考1基于角度的遮挡检测方法 在基于角度的方法中&#xff0c;通过依次分析DSM中沿径向方向的投影光线的角度来识别遮挡。定义α\alphaα角&#xff1a;DSM三维点与相机中心…

解决Windows虚拟机启动资源占用过多

由于虚拟机中的Windows一般是指定版本的&#xff0c;创建后&#xff0c;其自身仍在不断自动更新&#xff0c;因此这里我们禁用两个服务&#xff0c;以后启动Windows之后就不会占用太多资源了&#xff1a; 禁用setuphost.exe禁用.net runtime optimization 文章目录1. 禁用setu…

分布式定时任务-学习笔记

1 发展历程 1.1 Linux命令-CronJob 只能控制单台机器 1.2 任务调度-Quartz 单任务极致控制 1.3 分布式定时任务 1.3.1 定时任务 系统为了自动完成特定任务&#xff0c;实时、延时、周期性完成任务调度的过程 1.3.2 分布式定时任务 把分散的、可靠性差的定时任务纳入统一的平…

VScode下 ESP32 下载程序

ESP32-S3 下载方式可以通过UART0 下载,USB 下载&#xff0c;JTAG下载,还可以使用WIFI进行远程OTA升级程序。插件底栏按键介绍&#xff1a;①选择串口端口号&#xff0c;如COM3&#xff1b; ②选择芯片型号&#xff1b; ③工程idf设置&#xff0c;相当于menuconfig&#xff1b; …

Redis缓存雪崩、缓存击穿、缓存穿透

用户的数据一般都是存储于数据库&#xff0c;数据库的数据是落在磁盘上的&#xff0c;磁盘的读写速度可以说是计算机里最慢的硬件了。 当用户的请求&#xff0c;都访问数据库的话&#xff0c;请求数量一上来&#xff0c;数据库很容易就奔溃的了&#xff0c;所以为了避免用户直…

【Java】Spring Boot 日志文件

文章目录SpringBoot日志文件1. 日志有什么用2. 日志怎么用3. 自定义日志打印3.1 在程序中得到日志对象3.2 使用日志对象打印日志4. 日志级别4.1 日志级别有什么用&#xff1f;4.2 日志级别的分类与使用5. 日志持久化6. 更简单的日志输出--lombok6.1 添加 lombok 依赖6.2 输出日…

操作系统真相还原——第6章内存管理系统

第八章 内存管理系统 makefile 编译整个项目&#xff0c;如果改变局部关系&#xff0c;只靠人工难以维护文件间的依赖关系&#xff0c;所以通过make程序进行处理 makefile文件是make程序的搭档&#xff1a;发现某个文件更新后&#xff0c;只编译该文件和受该文件影响的相关文…

为什么95%的Java程序员人,都是用不好Synchronized?

Synchronized锁优化 jdk1.6对锁的实现引入了大量的优化&#xff0c;如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。 锁主要存在四中状态&#xff0c;依次是&#xff1a;无锁-> 偏向锁 -> 轻量级锁 -> 重量级锁&#xff0c;他们…

upload-labs通关详细教程

文章目录文件上传要点1、前端验证绕过做题步骤源码分析2、Content-Type方式绕过做题步骤源码分析3、黑名单绕过做题步骤源码分析4、.htaccess文件绕过简介做题步骤源码分析5、后缀大小写绕过简介做题步骤源码分析6、文件后缀&#xff08;空&#xff09;绕过简介做题步骤源码分析…

CAN工具-VSpy(ValueCAN) - Panel面板(续)

继续上次的Panel面板介绍&#xff01;&#xff01;&#xff01;7. LED 控件LED控件可以用作指示器。在Graphical Panels中选中该控件&#xff0c;在界面右侧侧拉框的Properties中可设置LED控件的通用属性。LED控制属性LED On Color&#xff1a;双击打开标准的Windows颜色选择器…

Vue 3.0 学习笔记之基础知识

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录系列文章目录前言Vue 3.0 创建与Vue2.0对比的变化关闭语法检查setup 组合式函数compositions前言 Vue 3.0 创建 与Vue2.0对比的变化 关闭语法检查 lintOnSave: false setup 组合式函数compositions…

Git 初体验 (处理 .ssh 文件的相关问题)

目录前沿环境入门教程出现的问题问题 1 &#xff1a;C 盘用户文件中找不到 .ssh 文件问题 2 : 在 clone 远程仓库文件时报错问题3 : 第一次从 Gitee clone 项目时会弹出一个 Git 窗口,要你输入用户和密码获取 credential (可以信任的证明)自我实践总结引用前沿 很早前安装了 G…

二叉树——删除二叉搜索树中的节点

删除二叉搜索树中的节点 链接 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可…

2022_SPL_CMINet

Cross-Stage Multi-Scale Interaction Network for RGB-D Salient Object Detection 用于rgb-d显着目标检测的跨阶段多尺度交互网络 目录 文章目录 前言 一、引言 二、提出的方法 A.概述 感觉有点乱&#xff0c;没看太懂&#xff0c;没关系&#xff0c;我们接着往下看 …

Postman 实现 UI 自动化测试

看到这篇文章的标题&#xff0c;是不是有小伙伴会感到惊讶呢&#xff1f; Postman 不是做接口测试的吗&#xff1f;为什么还能做 UI 自动化测试呢&#xff1f; 其实&#xff0c;只要你了解 Selenium 的运行原理&#xff0c;就可以理解为什么 Postman 也能实现 UI 自动化测试了…

EPICS motor模块

一、概要 1&#xff09; 在EPICS motor模块中的是什么并且它为了什么&#xff1f; 2&#xff09; 支持的电机控制器和模型 3&#xff09;电机记录特性 4&#xff09;配置示例 5&#xff09;反馈 6&#xff09; 重试 7&#xff09; 回程差矫正 8&#xff09;发行 二、术…

Linux上的校验和验证

校验和&#xff08;checksum&#xff09;程序用来从文件中生成相对较小的唯一密钥。我们可以重新计算该密钥&#xff0c;用以检查文件是否发生改变。修改文件可能是有意为之&#xff08;添加新用户会改变密码文件&#xff09;&#xff0c;也可能是无意而为&#xff08;从CD-ROM…

Java:Java仍然处于领先地位?

没有多少编程语言能够自吹自擂并持续流行20多年&#xff0c;但Java就是其中之一。Java应用程序不仅局限于web和移动开发&#xff0c;而且给大数据和人工智能留下了深刻的印象。不用多说&#xff0c;让我们讨论一下Java流行的几个原因!!1.实用性根据JamesGosling的说法&#xff…

QT+OpenGL 面剔除和帧缓冲

QTOpenGL 面剔除和帧缓冲 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 面剔除 OpenGL能够检查所有面向&#xff08;Front Facing&#xff09;观察者的面&#xff0c;并且渲染他们&#xff0c;而丢…

springboot logback日志+异常+阿里云日志 aliyun-log-logback-appender

前言最近有个新项目用了&#xff0c;springboot3.0&#xff0c;以前项目日志保存得方式是阿里云云服务自动读取日志文件&#xff0c;最近项目部署得方式可能有变化&#xff0c;所以新项目用logbackaliyun-log-logback-appender得方式保存到阿里云日志服务。用logback得原因主要…