LeetCode刷题之HOT100之找到数组中消失的数字

news2024/10/5 13:55:25

2024/5/24 今天早上没有下雨,太好了。下周就要搬到二楼会议室开发了,很多计划都要被打破了。事已至此,先做题吧!

在这里插入图片描述

2、逻辑分析

题目的要求是:给定一个长度为n的整数数组nums,要输出在[1,n]范围内但没有出现在nums中的数字,以数组的形式返回。想了五分钟以上,想不出来。看了官方题解也没怎么看懂,还是用哈希集合来存储,再遍历,没有出现的数就是我们要找的数。

3、代码演示

public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> res = new ArrayList<>();
        Set<Integer> set = new HashSet<>();
        // 遍历数组nums,将数组中的数字添加到HashSet中 
        for(int i = 0 ; i < nums.length; i++){
            set.add(nums[i]);
        }
        // 遍历从1到nums.length的数字
        for(int i = 1; i <= nums.length; i++){
            // 如果数字i不在HashSet中(即不存在于nums数组中),则它是缺失的数字
            if(!set.contains(i)){
                res.add(i);
            }
        }
        // 返回缺失的数字列表  
        return res;
    }

这里我们利用了Set集合中元素的唯一性来求解,逻辑简单,比较好想出来。时间复杂度:O(n),空间复杂度:O(n)。性能可能就没有那么好。还是来看看优化的算法:

  1. 利用数组 nums 本身作为哈希表来标记数字的出现情况。
  2. 将每个数字 num 映射到索引 (num-1) % n 处,并将对应位置的值加上 n。这样做的目的是为了标记该数字出现过。
  3. 在第二次遍历数组时,检查每个位置上的值是否小于等于 n。如果是的话,说明该位置上的数字没有出现过,将其添加到结果列表中。

下面看看代码:

public List<Integer> findDisappearedNumbers(int[] nums) {
        int n = nums.length;
        // 遍历数组 nums
        for(int num : nums){
            // 将数字 num 映射到索引范围 [0, n-1] 内
            int x = (num - 1)% n;
            // 将 nums[x] 加上 n,表示该数字出现过
            nums[x] += n; 
        }
        // 创建结果列表 ret
        List<Integer> ret = new ArrayList<Integer>();
        // 再次遍历数组 nums
        for(int i = 0; i < n ; i++){
            // 如果 nums[i] 小于等于 n,说明该位置上的数字没有出现过
            if(nums[i] <= n){
                // 将该位置 i+1 添加到结果列表中
                ret.add(i + 1);
            }
        }
        return ret;
    } 

其实仔细看看就可以理清逻辑了,下面看看它的运行过程是怎么样的:

假设我们有以下输入数组 nums = [4,3,2,7,8,2,3,1]。

首先,我们获取数组的长度 n = 8。

  1. 开始遍历数组 nums:

num = 4: x = (4-1) % 8 = 3, 将 nums[3] 加上 8, 即 nums[3] = 15。
num = 3: x = (3-1) % 8 = 2, 将 nums[2] 加上 8, 即 nums[2] = 10。
num = 2: x = (2-1) % 8 = 1, 将 nums[1] 加上 8, 即 nums[1] = 11。
num = 7: x = (7-1) % 8 = 6, 将 nums[6] 加上 8, 即 nums[6] = 11。
num = 8: x = (8-1) % 8 = 7, 将 nums[7] 加上 8, 即 nums[7] = 9。
num = 2: x = (2-1) % 8 = 1, 将 nums[1] 加上 8, 即 nums[1] = 19。
num = 3: x = (3-1) % 8 = 2, 将 nums[2] 加上 8, 即 nums[7] = 18。
num = 1: x = (1-1) % 8 = 0, 将 nums[0] 加上 8, 即 nums[0] = 12。
修改后的数组 nums = [12, 19, 18, 15, 8, 2, 11, 9]。

  1. 再次遍历数组 nums:

nums[0] = 12 > 8, 所以 1 出现了。
nums[1] = 19 > 8, 所以 2 出现了。
nums[2] = 18 > 8, 所以 3 出现了。
nums[3] = 15 > 8, 所以 4 出现了。
nums[4] = 8 <= 8, 所以 5 没有出现。
nums[5] = 2 <= 8, 所以 6 没有出现。
nums[6] = 11 > 8, 所以 7 出现了。
nums[7] = 9 > 8, 所以 8 出现了。
将没有出现的数字 5、6 添加到结果列表 ret 中,最终 ret = [5,6]。
通过这个例子,我们可以看到这个算法是如何利用数组本身作为哈希表来标记数字的出现情况,并最终找出消失的数字。整个过程非常高效,只需要遍历数组两次。

时间复杂度:O(n),空间复杂度:O(1)。

好啦,做完啦,有些许收获,休息一下,BYE!

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

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

相关文章

Docker 开启 SSL 验证

最近看 OJ 项目的远程开发阶段&#xff0c;然后踩坑踩了 2 天&#x1f602; Docker 版本&#xff1a;在 CentOS 安装 sudo yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io Client: Docker Engine - CommunityVersion: 20.10.9API version: …

本机与华为云ping不通的问题

进入华为云控制台。依次选择&#xff1a;云服务器->点击服务器id->安全组->更改安全组->添加入方向规则&#xff0c;添加一个安全组规则&#xff08;ICMP&#xff09;&#xff0c;详见下图 再次ping公网ip就可以ping通了 产生这一问题的原因是ping的协议基于ICMP…

浏览器输入URL到网页显示之间发生了什么

记&#xff1a; DNS(Domain Name System,域名系统)就是根据域名来查找对应的IP地址的一个关键系统。 域名层级关系&#xff1a; 根域名服务器&#xff08;.&#xff09;顶级域名服务器&#xff08;.com&#xff09;权威域名服务器&#xff08;server.com&#xff09; 首先浏…

超简单白话文机器学习-朴素贝叶斯算法(含算法讲解,公式全解,手写代码实现,调包实现

1. 朴素贝叶斯算法 朴素贝叶斯&#xff08;Naive Bayes&#xff09;算法是一类基于贝叶斯定理的简单而强大的概率分类器&#xff0c;它在假设特征之间相互独立的前提下工作。尽管这种“朴素”的假设在现实中很少成立&#xff0c;但朴素贝叶斯分类器在许多实际应用中表现良好&am…

灌区信息化管理系统助力灌区节水,打造绿色生态新农业

在现代化农业发展的浪潮中&#xff0c;如何实现节水、高效、绿色的农业生产成为了人们关注的焦点。智慧灌区信息化系统应运而生&#xff0c;以其独特的技术优势&#xff0c;助力灌区节水&#xff0c;打造绿色生态新农业&#xff0c;引领农业生产的未来。 灌区信息化管理系统&am…

高中数学:平面向量-题型总结及解题思路梳理

一、知识点及解题思路梳理 高中&#xff0c;2/3的向量题目是坐标向量题&#xff0c;1/3是几何向量题。但是&#xff0c;这1/3的几何向量题可以转换成坐标向量题。 二、练习 例题1 几何型向量题 例题2

LabVIEW波纹补偿器无线监测系统

LabVIEW波纹补偿器无线监测系统 在石油化工、冶金及电力等行业中&#xff0c;波纹补偿器作为一种重要的补偿性元件&#xff0c;其安全稳定的运行对管道输送系统的可靠性至关重要。开发了一种基于LabVIEW的波纹补偿器无线监测系统&#xff0c;通过实时监测波纹补偿器的工作状态…

Kubernetes的灵魂核心:kube-scheduler

Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化容器化应用程序的部署、扩展和管理。在Kubernetes集群中&#xff0c;kube-scheduler是一个至关重要的组件&#xff0c;它负责将Pod&#xff08;Kubernetes中的最小部署单元&#xff0…

Dom树和渲染树的细微差别,你能分清吗?

DOM树和渲染树都是浏览器渲染页面时生成的树形结构&#xff0c;但它们有一些区别。 1. DOM树&#xff1a; DOM树是由HTML解析器解析HTML文档生成的&#xff0c;它是文档的结构化表示&#xff0c;包含了HTML文档中的所有元素节点、文本节点、注释节点等&#xff0c;它是一个包…

“AI+综合节能改造”:打造数据中心热管理系统节能“秘籍”

维谛技术服务&#xff1a; 欧小明 曲鑫 当前&#xff0c;基于AI技术在确保精准制冷、实现节能和提升运营效率方面的重要作用&#xff0c;将AI技术与热管理系统改造相结合&#xff0c;实现深度协同&#xff0c;是数据中心节能改造的关键路径之一。 “AI综合节能改造”提升热管…

从ES5迈向ES6:探索 JavaScript 新增声明命令与解构赋值的魅力

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;声明命令 let、const&#x1f35f;1 let声明符&a…

51单片机入门:红外遥控

红外遥控系统简介 红外遥控系统是利用红外光进行通信的设备&#xff0c;通常由发射和接收两大部分组成&#xff0c;即&#xff1a;由红外LED将调制后的信号发出&#xff0c;再由专门的红外接收头进行解调输出。 红外LED&#xff1a;外表与普通的LED没有什么不同&#xff0c;发…

解锁合同管理的新路径:低代码与定制开发的完美结合

引言 合同管理在企业中扮演着至关重要的角色。无论是与供应商、客户还是合作伙伴之间的合作&#xff0c;合同都是约束双方责任和权利的关键文档。然而&#xff0c;随着业务的不断增长和全球化的发展&#xff0c;合同管理变得越来越复杂。传统的合同管理方法往往面临着诸多挑战&…

Web安全:SQL注入之时间盲注原理+步骤+实战操作

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

深入 Rust 标准库,Rust标准库源代码系统分析

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

彩信JSON接口对接发送

随着通讯技术的飞速发展&#xff0c;传统的短信已经无法满足人们日益增长的沟通需求。在这样的背景下&#xff0c;群发彩信作为一种更为先进、更为丰富的信息传递方式&#xff0c;逐渐受到了企业和个人的青睐。那么&#xff0c;群发彩信应该怎么对接&#xff0c;又具体有哪些优…

开发短剧平台的7大关键步骤,轻松掌握

短剧平台的开发是当前数字娱乐领域的热门话题之一。随着在线视频消费的增长和用户对短视频内容的需求不断增加&#xff0c;开发一个成功的短剧平台成为了许多创业者和企业关注的焦点。在本文中&#xff0c;我将分享开发短剧平台的7大关键步骤&#xff0c;帮助您轻松掌握这一过程…

文件外发审核是数据防泄漏的重要手段,那该怎么落地?

企业在日常经营中&#xff0c;无可避免地会产生文件外发的需求&#xff0c;文件发送对象包括但不限于合作方、供应商、客户、公关媒体、慈善组织等等&#xff0c;不一而足。而由于外发的对象不同&#xff0c;所涉及的文件类型也多种多样&#xff1a; 商业合作合同&#xff1a;…

react实现把pc网站快捷添加到桌面快捷方式

文章目录 1. 需求2. 实现效果3. 核心逻辑4. 完整react代码 1. 需求 这种需求其实在国外一些游戏网站和推广网站中经常会用到&#xff0c;目的是为了让客户 快捷方便的保存网站到桌面 &#xff0c;网站主动尽量避免下次找不到网站地址了&#xff0c;当然精确的客户自己也可以使…

【B站 heima】小兔鲜Vue3 项目学习笔记Day04

文章目录 二级分类1.整体认识和路由配置2.面包屑导航功能实现3. 基础商品列表实现4. 定制路由滚动行为 详情页1.整体认识和路由配置2.基础数据渲染3.热榜区域实现4. 图片预览组件封装5.放大镜-滑块跟随移动左侧滑块跟随鼠标移动放大镜-大图效果 6. props适配7. SKU组件熟悉使用…