iOS object-C 解答算法:找到所有数组中消失的数字(leetCode-448)

找到所有数组中消失的数字(leetCode-448)

题目如下图:(也可以到leetCode上看完整题目,题号448)

光看题看可能有点难以理解,我们结合示例1来理解一下这道题.

有8个整数的数组 nums = [4,3,2,7,8,2,3,1], 求在闭区间[1,8]范围内(即1,2,3,4,5,6,7,8)的数字,哪几个没有出现在数组 nums 中. 

我们很容易一看就看出,5和6没有出现在数组nums中.

还是拿示例1来说,如果可以用新建一个数组newNums = [1,2,3,4,5,6,7,8] 与 原数组nums = [4,3,2,7,8,2,3,1] 比较,立马可以找到缺少了元素5和6,但是题目要求不得使用额外空间.所以只能在原数组上操作.

解法一:

我们先来说一下常规解法(就是可以使用额外空间的解法). 遍历nums数组,把遍历到的元素一一在newNums数组里删除,剩下没删除的元素就是nunms没有的.

代码如下:

- (void)viewDidLoad 
{[super viewDidLoad];NSMutableArray * originalArray = [[NSMutableArray alloc]initWithObjects:@"4",@"3",@"2",@"7",@"8",@"2",@"3",@"1", nil];NSMutableArray * newArray = [[NSMutableArray alloc]init];for (int i = 1; i < originalArray.count + 1; i ++){[newArray addObject:[NSString stringWithFormat:@"%d",i]];}NSMutableArray * array2 = [self missNum:originalArray NewArray:newArray];NSLog(@"array2==%@",array2);
}- (NSMutableArray *)missNum:(NSMutableArray *)originalArray NewArray:(NSMutableArray *)newArray
{for (int i = 0 ; i < originalArray.count; i ++){NSString * oValue = originalArray[i];[newArray removeObject:oValue];}return newArray;
}

以上就是我们通常想到的常规解法,时间复杂度为O(n^2),空间复杂度为O(n). 

时间复杂度不符合题目要求的O(n), 题目还说了不占用额外空间(返回函数不算),这一点我不太懂,这一道题我开辟了很多空间,除了不算的返回函数newArray,还有int i, NSString * oValue, 这个算不算额外空间,如果有懂的小伙伴评论区帮我解答一下.

但是通常都是用空间换时间,所以这么写现实中问题不大.

解法二:

我们可以把 数组nums = [4,3,2,7,8,2,3,1] 看做是 数组newNums = [1,2,3,4,5,6,7,8],减去几个数,再增加几个相同的数(例如这里增加了2和3),再打乱它们的排列组合. 注意:nums和newNums的元素个数(就是count一定是相等的,这是题目隐含的意思).

所以在nums 里的index=0的元素4, 它原来的index应该为3. 我们就按照这个逻辑,把nums里所有元素的的原index都找到,那么剩下的没有找到的index,就是没有出现在nums 里的元素.

思路如下:

nums元素 4---->index = 3

nums元素 3---->index = 2

nums元素 2---->index = 1

nums元素 7---->index = 6

nums元素 8---->index = 7

nums元素 2---->index = 1

nums元素 3---->index = 2

nums元素 1---->index = 0

通过上面列出的思路,我们可以看到,index=4和index=5 没有出现,所以没有出现的数字为 5 和 6.

因为不能额外增加空间,所以我们不能新创建一个数组和存放index.那么我们只能使用标记法-->在原数组标记.

标记的方法有很多种,例如可以在数组前加个减号(-)标记, 也可以每个元素加上n标记(例如4+8),也可以使用符号标志(例如*,但是这道题是数字,明显不能用这个方法).

我们这里就使用减号标志号了

nums元素 4 ---> index = 3 ,在数组nums index=3的位置加个减号:nums = [4,3,2,-7,8,2,3,1];

nums元素 3 ---> index = 2 ,在数组nums index=2的位置加个减号:nums = [4,3,-2,-7,8,2,3,1];

nums元素 2 ---> index = 1 ,在数组nums index=1的位置加个减号:nums = [4,-3,-2,-7,8,2,3,1];

我们下一步按理说是要取元素7的,但是nums里7 已经变成-7了,所以我们为了不受标记影响,我们每次都取元素的绝对值(object-c取数字绝对值的方法为abs())

nums元素 7 ---> index = 6 ,在数组nums index=6的位置加个减号:nums = [4,-3,-2,-7,8,2,-3,1];

nums元素 8 ---> index = 7 ,在数组nums index=7的位置加个减号:nums = [4,-3,-2,-7,8,2,-3,-1];

下一步的元素2.index=1 的位置已经标记了减号,所以我么标记之前先判断待标记的位置是否为负数,如果为负数,则无需重复标记

nums元素 2 ---> index = 1 ,无需重复标记

nums元素 3 ---> index = 2 ,无需重复标记

nums元素 1 ---> index = 0,在数组nums index=0的位置加个减号:nums = [-4,-3,-2,-7,8,2,-3,-1];

经过一个for循环的标记,我们就找出数组里为正数数的index,即得到没有出现的数字

代码如下:

- (NSMutableArray *)missNum2:(NSMutableArray *)originalArray
{for (int i = 0 ; i < originalArray.count; i ++){//1.取值要取绝对值 abs()int value = abs([originalArray[i] intValue]);//2.获得元素的indexint index = value - 1;//3.标记index//3.1.标记之前要判断index的元素是否为负数,如果为负数,则说明已经标记过了,无需标记if (originalArray[index] > 0){originalArray[index] = [NSString stringWithFormat:@"-%@",originalArray[index]];}NSLog(@"originalArray==%@",originalArray);}NSMutableArray * newArray = [[NSMutableArray alloc]init];for (int i = 1; i < originalArray.count + 1; i ++){[newArray addObject:[NSString stringWithFormat:@"%d",i]];}return newArray;
}

以上代码的时间复杂度为O(n),空间复杂度也为O(n)

时间复杂度满足题目要求, 这个写法我也开辟了很多空间,除了不算的返回函数newArray,还有int value, int index , int i, 这个算不算额外空间,如果有懂的小伙伴评论区帮我解答一下.

​​​​​​​但是通常都是用空间换时间,所以这么写现实中问题不大.

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

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

相关文章

达梦数据库系列—30. DTS迁移Mysql到DM

目录 1.MySQL 源端信息 2.DM 目的端信息 3.迁移评估 4.数据库迁移 4.1源端 MySQL 准备 4.2目的端达梦准备 初始化参数设置 兼容性参数设置 创建迁移用户和表空间 4.3迁移步骤 创建迁移 配置迁移对象及策略 开始迁移 对象补迁 5.数据校验 统计 MySQL 端对象及数…

C++ 代码实现局域网即时通信功能 (windows 系统 客户端)

本项目使用C实现具备多个客户端和服务器端即时通信聊天功能软件 一&#xff1a;项目内容 使用C实现一个具备多客户端和一个服务器端即时通信功能的聊天软件。 本项目的目的是 学习在windows平台下&#xff0c;进行C网络开发的基本概念&#xff1a;TCP/IP socket通信&#xff0…

一键解锁:科研服务器性能匹配秘籍,选择性能精准匹配科研任务和计算需求的服务器

一键解锁&#xff1a;科研服务器性能匹配秘籍 HPC科研工作站服务器集群细分领域迷途小书童 专注于HPC科研服务器细分领域kyfwq001 &#x1f3af;在当今科技飞速发展的时代&#xff0c;科研工作对计算资源的需求日益增长&#x1f61c;。选择性能精准匹配科研任务和计算需求的服…

Elasticsearch集群配置-节点职责划分 Hot Warm 架构实践

前言 本文主要讲了ES在节点部署时可以考虑的节点职责划分&#xff0c;如果不考虑节点部署&#xff0c;那么所有节点都会身兼数职&#xff08;master-eligible &#xff0c;data&#xff0c;coordinate等&#xff09;&#xff0c;这对后期的维护拓展并不利&#xff0c;所以本文…

Gitops-Argo-Cli安装与使用

一、安装Argo-Cli工具 Release v2.9.21 argoproj/argo-cd GitHub **选择合适的符合你操作系统以及CPU架构的二进制文件 #依v2.9.21-X86-64-Linux操作系统为例 wget https://github.com/argoproj/argo-cd/releases/download/v2.9.21/argocd-linux-amd64 #添加执行权限并且移…

景区AR导航营销系统:技术解决方案与实施效益分析

随着旅游市场的竞争日益激烈&#xff0c;景区需要不断创新以吸引游客。景区 AR 导航将虚拟画面与现实场景相结合&#xff0c;为游客提供了更加直观、生动的导航服务。对于景区而言&#xff0c;这一创新技术无疑是吸引游客目光、提升景区知名度的有力武器。通过独特的 AR 导航体…

计算机网络-配置路由器ACL(访问控制列表)

配置访问控制列表ACL 拓扑结构 拓扑结构如下&#xff1a; 要配置一个ACL&#xff0c;禁止PC0访问PC3&#xff0c;禁止PC4访问PC0&#xff0c;其它正常。 配置Router0 配置接口IP地址&#xff1a; interface fastethernet 0/0 ip address 192.168.1.1 255.255.255.0 no shu…

elmentui this.$confirm使用模板字符串构建HTML结构

tip(){const checkingList [];const findList[入会1,入会2,入会3] //数组const sueccList [{name:入会,suecc:1000,numcot:1000},{name:aaaaa,suecc:222,numcot:3333}] //数组对象var message// 使用模板字符串构建HTML结构if(sueccList.length>0){message <div>…

缓存穿透,缓存击穿,缓存雪崩

目录 介绍 缓存穿透 缓存击穿 缓存雪崩 原因 影响 解决方案 缓存穿透 防止缓存穿透->空值缓存案例 缓存击穿 使用互斥锁解决缓存击穿 介绍 缓存穿透 定义&#xff1a;缓存穿透是指用户查询数据&#xff0c;缓存和数据库中都不存在该数据&#xff08;一般是发起恶意…

Mac应用快速启动器:Alfred 5 for Mac 激活版

Alfred 5 是一款专为 macOS 系统设计的效率提升工具。这款软件以其快速启动和高效操作功能著称&#xff0c;通过使用快捷键来呼出输入界面&#xff0c;用户可以快速完成各种任务。 最新版本 Alfred 5.5 引入了一些新功能。其中包括整合了 ChatGPT 和 DALL-E&#xff0c;这意味…

linux root登陆,密码正确但,错误提示su: Authentication failure

初开始登陆的时候会显示失败&#xff0c;参考了很多网上的做法&#xff0c;但还是不行&#xff0c;但是&#xff0c;如果用键盘左边那一排数字按键输入&#xff0c;就可以正常登陆&#xff08;之前用的是右边的九宫格&#xff09;

Mindspore框架循环神经网络RNN模型实现情感分类|(四)损失函数与优化器

Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;一&#xff09;IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;二&#xff09;预训练词向量 Mindspore框架循环神经网络RNN模型实现…

图论之求树的重心

文章目录 题目简要分析解题思路代码实现 题目 原题链接&#xff1a;https://www.acwing.com/problem/content/848/ 题目描述 给定一颗树&#xff0c;树中包含 n 个结点&#xff08;编号 1∼n&#xff09;和 n−1条无向边。请你找到树的重心&#xff0c;并输出将重心删除后&am…

钉钉 ai卡片 stream模式联调

sdk连接 新建卡片模板下载node.js sdkconfig.json 配置应用信息 启动项目npm i npm run build npm run start连接成功 获取卡片回调 注册卡片回调事件调用https://api.dingtalk.com/v1.0/card/instances 创建卡片实例&#xff0c;返回实例Id //参数结构 {"cardTempla…

Linux文件与相关函数的知识点1

Open函数 高频使用的Linux系统调用&#xff1a;open write read close Linux 自带的工具&#xff1a;man手册&#xff1a; man 1是普通的shell命令&#xff0c;比如ls 调用命令&#xff1a;man 1 ls man 2是系统调用函数&#xff0c;比如open&#xff0c;write 调用open…

AV1技术学习:Quantization

量化是对变换系数进行&#xff0c;并将量化索引熵编码。AV1的量化参数 QP 的取值范围是0 ~ 255。 一、Quantization Step Size 在给定的 QP 下&#xff0c;DC 系数的量化步长小于 AC 系数的量化步长。DC 系数和 AC 系数从 QP 到量化步长的映射如下图所示。当 QP 为 0 时&…

MySQL的高可用(MHA)

高可用模式下的故障切换&#xff0c;基于主从复制。 单点故障和主从复制不能切换的问题。 至少需要三台。 故障切换过程0-30秒 vip地址&#xff0c;根据vip地址所在的主机&#xff0c;确定主备。 主 vip 备 vip 主和备不是优先级确定的&#xff0c;主从复制的时候就确定…

BGP之选路MED

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较&#xff0c;以确定去往该目标网络的最优BGP路由。BGP路由属性的比较顺序为Preferred Value属性、Local Preference属性、路由生成方式、AS_Path属性、Origin属…

一款简而轻的项目运维监控软件,支持低侵入式在线构建、自动部署、日常运维(附源码)

前言 在当今快速发展的软件开发领域&#xff0c;开发团队经常面临一系列运维挑战。没有专业运维人员的支持&#xff0c;开发人员不得不承担构建和部署项目的任务。 面对不同项目的构建和部署命令&#xff0c;以及多环境的打包需求&#xff0c;开发人员需要一个能够简化这些流…

算法 day4 【双指针、快慢指针、环形链表】链表下

⚡刷题计划day4继续&#xff0c;可以点个免费的赞哦~ 下一期将会开启哈希表刷题专题&#xff0c;往期可看专栏&#xff0c;关注不迷路&#xff0c; 您的支持是我的最大动力&#x1f339;~ 目录 ⚡刷题计划day4继续&#xff0c;可以点个免费的赞哦~ 下一期将会开启哈希表刷题…