找到所有数组中消失的数

news/2025/1/15 19:52:07/

找到所有数组中消失的数,OJ练习

  • 一、描述
  • 二、方法一
  • 三、方法二

一、描述

给你一个含n个整数的数组nums,其中nums[i]在区间[1,n]内。请你找出所有在[1,n]范围内但没有出现在nums中的数字,并以数组的形式返回结果,本题OJ链接
示例 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) ,空间复杂度为O(1)

二、方法一

采用标记的方式,用空间换时间,开辟一个标记数组,初始化为0,用nums[i]作为标记数组的下标,将对应元素赋值为1,处理完数组nums之后,再遍历一遍标记数组,元素为0的下标就是消失的数字
注意:返回数组不算额外开辟的空间
分析:时间复杂度O(n),空间复杂度O(n)
代码实现:

int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{int* flagArr = (int*)calloc(numsSize + 1, sizeof(int)); //开辟标记数组并初始化为0int* returnArr = (int*)malloc(sizeof(int) * numsSize); //开辟返回数组int i = 0;for(i = 0; i < numsSize; i++) //用nums[i]作为标记数组的下标,将对应元素赋值为1{flagArr[nums[i]] = 1;}*returnSize = 0;for(i = 1; i < numsSize + 1; i++) //检查标记数组并给返回数组赋值{if(flagArr[i] == 0){returnArr[(*returnSize)++] = i;}}return returnArr;
}

三、方法二

采用标记的方式,此方法标记和上一种标记方法不同,不用开辟额外数组,在原数组中标记,数组中的每个元素在[1~n],用每个元素nums[i]的绝对值减1作为数组nums的下标,将对应位置的元素改为负数,表示数字nums[i]出现过,直到处理完所有元素,再遍历一遍数组,为正数的元素下标加1就是消失的数字,注意:同一位置的元素不能重复改为负数,也就是说这个元素是负数的话,就不用再改为负数了,因为负负为正,两次改负数之后,就不能代表它出现过
分析:时间复杂度O(n),空间复杂度O(1)
代码实现:

int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{int* returnArr = (int*)malloc(sizeof(int) * numsSize);int i = 0;for(i = 0; i < numsSize; i++) //遍历{if(nums[abs(nums[i]) - 1] > 0) //元素为正,才需要改为负数{nums[abs(nums[i]) - 1] = -nums[abs(nums[i]) - 1];}}*returnSize = 0;for(i = 0; i < numsSize; i++) //查找消失的数字,并放到返回数组中{if(nums[i] > 0){returnArr[(*returnSize)++] = i + 1;}}return returnArr;
}

http://www.ppmy.cn/news/1056053.html

相关文章

软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用

软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用 一、相关知识点二、摘要三、正文四、总结一、相关知识点 软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构二、摘要 本文从一个行业MIS系统的开发实践,讨论了软件开发平台的选择和应…

安卓动态申请权限

我们在使用一些官方app时&#xff0c;刚下载进去之后经常会弹出各种各样的权限获取请求&#xff0c;今天简单学习了下&#xff0c;希望不会误人子弟哈哈哈哈。 一、将需要用到的权限添加到Manifest清单里 <uses-permission android:name"android.permission.WRITE_EXT…

Docker是什么?详谈它的框架、使用场景、优势

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、什么是 Docker&#xff1f; 二、Docker 的架构 1、Docker客户端 2、Docker守护进程 3、Docker镜像 4、Docker容器 5、Docker…

手写嵌入式操作系统

学习之前需要安装keil 参照Keil uvision5安装 #include<stc8h.h> #include<intrins.h> #define MAX_TASKS 2 //假设当前系统只有2个task #define MAX_TASK_DEP 32unsigned char idata task_sp[MAX_TASKS]; //任务的堆栈指针 unsigned char idata task_stack[M…

每日一学——认识路由器

路由器是一种网络设备&#xff0c;它用于在计算机网络中转发数据包。它能够在不同的网络之间选择最佳路径&#xff0c;将数据从源地址传输到目的地址。 路由器工作原理&#xff1a; 路由表&#xff1a;路由器内部有一个路由表&#xff0c;它记录了网络的连接关系和路径。路由器…

VUE id回写name的问题

起因 我们有部门&#xff0c;单位&#xff0c;传的是id&#xff0c;但是页面不管显示&#xff0c;还是回写&#xff0c;新增都要展示单位名/部门名。这个其实是前端的事情&#xff0c;但是我目前是前端也是我做&#xff0c;我们使用的是vue3&#xff0c;这个问题用List可能不好…

【GeoDa实用技巧100例】022:geoda生成空间权重矩阵(邻接矩阵、距离矩阵)

geoda生成空间权重矩阵(邻接矩阵、距离矩阵),车式矩阵、后式矩阵、K邻接矩阵。 文章目录 一、概述二、“车式”邻接的gal文档生成三、“后式”邻接gal文档生成四、k最近邻居gat文档生成五、查看gal和gat文档一、概述 空间权重矩阵(或相应的表格形式)一般需要用计算机软件生…