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

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;// 遍历数组 numsfor(int num : nums){// 将数字 num 映射到索引范围 [0, n-1] 内int x = (num - 1)% n;// 将 nums[x] 加上 n,表示该数字出现过nums[x] += n; }// 创建结果列表 retList<Integer> ret = new ArrayList<Integer>();// 再次遍历数组 numsfor(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.mzph.cn/bicheng/14154.shtml

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

相关文章

JS 实现鼠标框选(页面选择)时返回对应的 HTML 或文案内容

JS 实现鼠标框选&#xff08;页面选择&#xff09;时返回对应的 HTML 或文案内容 一、需求背景 1、项目需求 当用户进行鼠标框选选择了页面上的内容时&#xff0c;把选择的内容进行上报。 2、需求解析 虽然这需求就一句话的事&#xff0c;但是很显然&#xff0c;没那么简单…

Linux 进程相关概念

用以下指令查找正在运行的进程&#xff0c;并使用 grep 过滤出包含 "int" 的行。 "ps -aux" 显示当前系统上所有用户的进程列表&#xff0c;而 grep 命令则筛选出包含 "int" 的行。 ps -aux|grep int p代表process进程 1.什么是程序&#xff…

【代码随想录】【算法训练营】【第17天】 [110]平衡二叉树 [257]二叉树的所有路径 [404]左叶子之和

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 17&#xff0c;又是一个令人愉快的周五~ 题目详情 [110] 平衡二叉树 题目描述 110 平衡二叉树 解题思路 前提&#xff1a;平衡二叉树&#xff1a;左右子树高度差不超过1, 思路&#xff1a;…

短视频商城全套源码:开启电商新纪元

随着数字媒体的快速发展&#xff0c;短视频平台已经成为人们获取信息、娱乐和社交的重要渠道。在这样一个大背景下&#xff0c;短视频商城的兴起&#xff0c;无疑为电商行业带来了新的机遇和挑战。本文将探讨短视频商城全套源码的重要性&#xff0c;以及它如何助力商家和开发者…

并发编程常见面试题

文章目录 为什么要使用线程池为什么不建议使用 Executors静态工厂构建线程池synchronized的实现原理Synchronized和Lock的区别什么是AQS什么是阻塞队列 为什么要使用线程池 关于线程池的作用和线程池的执行流程参考&#xff1a;java线程池 为什么不建议使用 Executors静态工厂…

云HIS医院信息管理系统源码(二级、乡镇、民营医院):云HIS系统与传统HIS系统的不同

云HIS医院信息管理系统源码&#xff08;二级、乡镇、民营医院&#xff09;&#xff1a;云HIS系统与传统HIS系统的不同 什么是医疗SaaS软件平台&#xff1f; HIS-SaaS&#xff08;Hospital Information System Software as a Service&#xff09;是一种医院信息系统的服务模式&…

引领数字创作新潮流——Autodesk Maya 2025 for Mac/win

作为全球领先的三维动画和视觉特效软件&#xff0c;Autodesk Maya 2025 引领着数字创作的新潮流。无论是电影、游戏、电视剧还是虚拟现实项目&#xff0c;Maya 2025 都是创作者们不可或缺的强大工具。 Maya 2025 在功能上持续创新&#xff0c;提供了一系列强大的工具和功能&am…

【网络与并发编程】

网络与并发编程 1. 网络编程1.1 网络基础知识1.1.1 什么是网络1.2.3 网络功能1.2.3 网络分类1.2.4 网络性能衡量指标1.2.5 网络编程中的几个关键概念1.2.6 网络通信要解决的问题1.2.7 网络通信协议1.1.8 网络通信标准1.1.9 通信地址 1.2 UDP 传输方法1.2.1 套接字简介1.2.2 UDP…

【全开源】智能名片系统源码(Fastadmin+ThinkPHP和Uniapp)

数字时代的新名片&#xff0c;连接未来的桥梁 引言 在数字化浪潮的推动下&#xff0c;传统名片已经逐渐淡出人们的视线。取而代之的是智能名片系统&#xff0c;它以其高效、便捷和智能化的特点&#xff0c;成为了商务交流的新宠。而智能名片系统源码&#xff0c;作为其核心驱…

SAP销售手工发票录入

销售手工发票录入用于处理未启用 SD 模块标准处理流程的零星销售业务。 科目设置 收入类科目&#xff1a;设置税务类型&#xff0c;允许含税/不含税过账应收账款: 留空。其他应收款的设置类似 编辑选项设置 在中国&#xff0c;编辑选项一般设置为基于总额计税。使用事务码 FB…

操作系统课程实验3-可变分区存储管理

操作系统课程实验3-可变分区存储管理 一、实验介绍 1.1 实验目的 加深对可变分区存储管理的理解&#xff1b;提高用C语言编制大型系统程序的能力&#xff0c;特别是掌握C语言编程的难点&#xff1a;指针和指针作为函数参数&#xff1b;掌握用指针实现链表和在链表上的基本操作…

如何设计足够可靠的分布式缓存体系,以满足大中型移动互联网系统的需要?no.31

传统 CAP 的突破 随着分布式系统的不断演进&#xff0c;会不断遇到各种问题&#xff0c;特别是当前&#xff0c;在大中型互联网系统的演进中&#xff0c;私有云、公有云并行发展且相互融合&#xff0c;互联网系统的部署早已突破单个区域&#xff0c;系统拓扑走向全国乃至全球的…

新书推荐:6.2 else if语句

本节必须掌握的知识点&#xff1a; 示例代码二十 代码分析 汇编解析 ■if语句表达形式3 if(表达式1) statement1 else if(表达式2) statement2 else if(表达式3) statement3 …… else statementN 解析&#xff1a; 如果表达式1非0&#xff0c;则执行statement1&#…

记录github小程序短视频系统的搭建过程

GitHub - lkmc2/AwesomeVideoWxApp: 《倾心短视频》微信小程序 这个项目按readme中的来可以部署成功&#xff0c;但是会发现图片、视频全是空的&#xff0c;如下图&#xff1a; 修改源代码&#xff0c;更换图片上传与保存地址 大概涉及到这些代码块&#xff0c;进行更改即可。…

什么样的数据摆渡设备,可以满足不同网间数据的安全传输需求?

数据摆渡设备是用来在不同的网络环境间安全地传输数据的硬件或软件解决方案。它们通常用于确保在具有不同安全级别的网络&#xff08;如内网和外网&#xff09;之间进行数据交换时的安全性和合规性。以下是一些常见的数据摆渡设备和方法&#xff1a; 移动介质拷贝&#xff1a;使…

生产制造边角料核算说明及ODOO演示

今天群里有伙伴提到边角料的处理问题&#xff0c;我们梳理了一下&#xff0c;在生产过程中&#xff0c;如果产生了边角料&#xff0c;核算产成品的投料成本时需要考虑边角料的价值&#xff0c;以确保成本核算的准确性。以下是注意的几点&#xff1a; 一、边角料的入账价值 在生…

OSPF路由聚合

原理概述 与RIP不同&#xff0c;OSPF不支持自动路由聚合&#xff0c;仅支持手动路由聚合。OSPF的路由聚合有两种机制&#xff1a;区域间路由聚合和外部路由聚合。区域间路由聚合必须配置在ABR路由器上&#xff0c;指的是ABR在把与自己直接相连区域&#xff08;Area&#xff09…

K8s 二进制部署---下篇(多master节点 负载均衡 高可用)

一 master02 节点部署 master01192.168.11.5kube-apiserver&#xff0c;kube-controller-manager&#xff0c;kube-scheduler&#xff0c;etcdmaster02192.168.11.12kube-apiserver&#xff0c;kube-controller-manager&#xff0c;kube-scheduler&#xff0c;etcdnode01192.1…

RHEL7及之后系统 系统服务脚本(Rocky 9.4)

目录 源码安装 准备工作 步骤1: 下载软件 步骤2: 安装apr 步骤3: 安装apr-util 步骤4: 安装Apache HTTP Server 总结步骤 后续步骤 源码安装 准备环境&#xff1a;首先&#xff0c;确保你的系统中安装了必要的编译工具和依赖库。对于C/C程序&#xff0c;这通常包括编译器&#…

一阶数字高通滤波器

本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真 1 计算公式推导 1.1.2 算法实现及仿真 利用python实现的代码如下&#xff1a; import numpy as np # from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt #2pifW…