【每日易题】数组下标的逆天用法——你见过把数组存储的值当作数组下标来解题的吗?

勤时当勉励 岁月不待人
C/C++ 游戏开发
Hello,米娜桑们,这里是君兮_,在最近是刷题中,遇到了一种非常新奇的数组下标的用法,今天想来给大家分享一下这种神奇的思路和方法,希望能在你遇到类似问题时能通过这种方法快速解决
数组中消失的它
- 一.题目介绍
- 二.数组下标的特别用法
- 思路分析
- 具体详解以及代码
- 总结
一.题目介绍
- LeetCode此题的oj链接在这里
找到所有数组中消失的数字

- 如果你看过我上一篇有关“单身狗”的每日易题的话,你可能会觉得这个题不过就是单身狗问题的一个变种,但是这里最大的问题在于,具体到题目中,我们无法确定有几条“单身狗”,也就是不知道具体有几个消失的数字,因此,大多数人可能会产生这样一种思路,并且写出下面这段代码
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){*returnSize = 0;
int j = 0;
int count = 0;
int size = 0;
int* returnNum = (int*)malloc(sizeof(int) * (numsSize - 1));
for (int i = 1; i <= numsSize; i++)
{for (j = 0; j < numsSize; j++){size = j;if (nums[j] == i)break;}if (nums[size] != i){returnNum[(*returnSize)++] = i;}}
return returnNum;
}
- 大致的思路是,从1-n,每次都遍历一遍数组,当遍历完一个自然数后,如果数组中没有对应的数字,就说明数组中没有这个数,把它放进需要返回的数组中
- 这种思路是非常正常并且正确的,但是,很遗憾,是过不了所有测试用例的

- 原因很简单,时间复杂度为o(n^2),一旦给出上图类似的测试用例时,就会超出运行的时间限制,下面我来介绍一种新的思路
二.数组下标的特别用法
思路分析
- 题目的要求是要找的消失的数字,也就是数组中不存在的数字,如果不存在这个数字,那我们如果把数组中的数字作为数组的下标,是不是就找不到消失的数字的数组下标呢?
- 好好想想上面这句话,我们来进一步思考
- 如果找不到对应消失数字的下标,那么就会出现这样一种情况,当我们把数组中存放的元素作为数组的下标进行统一的操作,由于不存在消失数字的下标,我们就无法对该消失数字做下标的位置进行操作,这样存在的数字和消失的数字就有了区别,我们就可以判断哪些下标位置的元素没进行某种操作返回下标这种方法来找到我们的消失的数字了(就是此时的下标)
具体详解以及代码
通过上面的分析,我们可以得到以下的解题思路:
我们首先重置一遍数组中的值,将数组中每个位置存储的值作为操作的数组的下标,将该下标的值改为负值,循环n次后,此时以数组中存放的值的为下标存储的元素全部被改为负值,只有以数组中不存在的值的下标的元素未被修改仍为正值,遍历一遍数组,如果数组下标存储的元素的值为正,说明下标+1就为消失的数字,把它们依次填入需要返回的数组即可
-
以数组[ 2,3,3,2,4]为例

-
这里还有几点需要注意的地方
-
1.我们知道,有消失的数字就一定有重复的数字,因此我们在置负值时,需要先判断一下该下标存储的值是否为负,如果为负,就不需要再改了,同时也是由于这个原因,我们不想看到数组下标出现负数的情况(之前某个位置存储过我们此时的下标,并且我们已经置负了),因此下标中需要加绝对值
-
2.由于我们的数组下标是从0开始的,因此我们在返回消失的数字时,应该进行+1还原
-
源码如下:
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){for(int i=0;i<numsSize;i++){if(nums[abs(nums[i])-1]>0)//abs置绝对值,-1是因为数组下标从0开始nums[abs(nums[i])-1]*=-1;}//减一是因为数组中必有一个在1到n中存在的数 比如111111111111111111 一定有1int*ret=(int*)malloc(sizeof(int)*(numsSize-1));*returnSize=0;for(int i=0;i<numsSize;i++){if(nums[i]>0)ret[(*returnSize)++]=i+1;//下标从0开始,消失的数字要+1}return ret;
}
}

- 我们这种方法,时间复杂度为O(n),不算需要返回的数组,空间复杂度为O(1),无疑是非常高效且省内存的。
总结
-
今天的内容到这里就结束了,如果一时理解不了我的建议是自己带入一些具体的例子画图分析,这样很容易就大致明白每一步操作在干嘛了,如果你明白了的话,不妨自己试着用这种方法来解一下这道题哦!!
-
好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!
新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!
**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

相关文章:
【每日易题】数组下标的逆天用法——你见过把数组存储的值当作数组下标来解题的吗?
君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,在最近是刷题中,遇到了一种非常新奇的数组下标的用法,今天想来给大家分享一下这种神奇的思路和方法,希望能在你遇到类似问题时能通…...
mysql基本操作
常用的数据类型 int 整型用于定义整数类型的数据float 单精度浮点4字节32位 准确表示到小数点后六位 double 双精度浮点8字节64位双精度浮点8字节64位char 固定长度的字符类型用于定义字符类型数据varchar可变长度的字符类型 text文本image图片de…...
vue组件的使用
一、首先要穿件组件构造器对象,或者导入组件 1..在本部分注册组件其中组件为子组件 2.在本部分注册组件 二、而后注册组件 1.在本部分注册组件其中组件为子组件 2.在本部分注册组件 三、 接着,使用组件。 1.在本部分注册组件其中组件为子组件 其中v-i…...
Axure设计之日期选择器(年月选择)
在系统中,日期选择器经常会用到,包括日历日期的选择、日期时间的选择和日期范围的选择,一般是下拉列表的形式进行选择。Axure没有自带的日期选择器,下面教大家如何在Axure中制作真实日期选择(年月选择)效果…...
CAD泰森多边形框架3D插件
插件介绍 CAD泰森多边形框架3D插件可用于在AutoCAD软件内生成三维Voronoi框架结构实体模型,适用于多孔Voronoi科研论文渲染绘图、Voronoi框架有限元建模、Voronoi空间结构优化等方面的应用。 使用说明 插件可设置生成的几何尺寸、晶格尺寸及边框直径等信息。 插…...
Django的render()函数的三个主要参数详解,特别是第三个字典类型的参数context
当在Django中使用 render() 函数时,它有三个主要参数:request,template_name,和 context。第三个参数,即 context,是一个字典,用于将数据传递给模板以进行渲染。 在下面的代码中: …...
统计不同字段的值域
目录 背景数据库表 需求目标SQL知识点注意点 背景 数据库 PostgreSQL 表 tbl_mr hosxblyfsylfkfs广东医院1301广东医院1404浙江医院0307浙江医院0209………… tbl_emr hosxblyfsylfkfs广东医院9999903广东医院1408浙江医院9507浙江医院0214………… 其中 xb 字段为 num…...
js this 指的是什么
1 对象中方法 函数中的this 指的是包含它的对象, 子对象中的this指的是全局在浏览器中是 window 对象 var obj1 {this1funcA: function() {var obj2 {innerFunc: function() {this2}};obj3{ this3 }}obj4{ this4 } }; 在这个对象中,this 的指向会随着调用上…...
用pytorch实现Resnet
ResNet(Residual Network)是一种深度卷积神经网络架构,由Kaiming He等人于2015年提出。它在计算机视觉领域引起了革命性的变革,使得训练更深的神经网络成为可能,超越了传统网络架构的限制。 ResNet的主要创新在于…...
C++类成员的访问权限以及类的封装
C通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。 Java、C# 程序员注意,C 中的 publ…...
Linux 多线程解决客户端与服务器端通信
一、一个服务器端只能和一个客户端进行通信(单线程模式) 客户端代码ser.c如下: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/socket.h> #include<netinet…...
FMX的TListBox单选列表框
TListBox功能比较全,对于选择项,有“两种”模式,一种就是ListItem选中(界面上就是焦点和颜色变化),可以无,单选和多选。另一种是通过CheckBox来选择ListItem的选中。默认下,ShowChec…...
prompt工程(持续更新ing...)
诸神缄默不语-个人CSDN博文目录 我准备想办法把这些东西整合到我的ScholarEase项目里。到时候按照分类、按照prompt生成方法列一堆选项,用户自己生成prompt后可以选择在ScholarEase里面聊天,也可以复制到别的地方(比如ChatGPT网页版之类的&a…...
win11 docker-desktop安装记录
win11安装Docker踩坑实录 马上开始正式工作了,需要用到docker,以前在win10上安装过,新电脑是win11,心想肯定会遇到坑,就浅浅记录一下 首先看一下安装要求 需要wsl2 那么就先进行 wsl的更新 wsl --update注意这里网络…...
opencv特征提取、梯度计算
...
AI绘画工具MJ新功能有点东西,小白也能轻松一键换装
先看最终做出来的效果 直接来干货吧。Midjourney,下面简称MJ 1.局部重绘功能来袭 就在前两天,MJ悄咪咪上线了这个被众人期待的新功能:局部重绘。 对于那些追求创新和个性化的设计师来说,局部绘制不仅是一个实用的功能ÿ…...
java springboot sql防注入的6种方式
在Spring Boot中,可以通过使用参数绑定、预处理语句和使用ORM框架等方式来防止SQL注入。以下是几种常见的方式: 1. 参数绑定:通过使用参数绑定,将用户输入的数据作为参数传递给SQL语句,而不是将其直接拼接到SQL语句中…...
深度学习实战49-基于卷积神经网络和注意力机制的汽车品牌与型号分类识别的应用
大家好,我是微学AI,今天给大家介绍一下深度学习实战49-基于卷积神经网络和注意力机制的汽车品牌与型号分类识别的应用,该项目就像是一只智慧而敏锐的眼睛,专注地凝视着汽车世界。这个项目使用PyTorch作为强有力的工具,提供了一个深度学习的舞台,让我们能够设计和训练一个…...
Open3D(C++) 可视化(3)——批量动态可视化点云
目录 一、概述二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 拿到一个新的点云数据集,想要快速查看数据集内点云的形状特征。然而,对于动辄几千个点云的数据集而言,逐个将点云拖入…...
opencv 文档识别+UI界面识别系统
目录 一、实现和完整UI视频效果展示 主界面: 识别结果界面: 查看处理图片过程: 查看历史记录界面: 二、原理介绍: 将图像变换大小->灰度化->高斯滤波->边缘检测 轮廓提取 筛选第三步中的轮廓…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
