当前位置: 首页 > news >正文

Leetcode 448. 找到所有数组中消失的数字

原题链接:Leetcode 448. Find All Numbers Disappeared in an Array

Given an array nums of n integers where nums[i] is in the range [1, n], return an array of all the integers in the range [1, n] that do not appear in nums.

Example 1:

Input: nums = [4,3,2,7,8,2,3,1]
Output: [5,6]

Example 2:

Input: nums = [1,1]
Output: [2]

Constraints:

  • n == nums.length
  • 1 <= n <= 105
  • 1 <= nums[i] <= n

Follow up: Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.


题目大意:

有一个长度为n的数组 nums ,数组里面的元素范围在 [1, n] ,要求找到 [1, n] 中没有在 nums 中出现过的元素。
要求要线性时间复杂度,以及算法原地工作

方法一:原地修改数组(偏移量)

思路:

原地修改数组相当于对元素做上标记(且能还原),一般有添加负号或者加偏移量两种。
这里采用加偏移量做标记,元素t对应于下标t-1。

  1. 遍历一遍数组,当遍历到num[i]时,元素nums[i]存在,那么就在他对应的下标位置加上n。也就是nums[nums[i] - 1] += n ,而且可能nums[i]已经加过偏移量了,需要先取余。
  2. 之后再遍历一遍数组,只要打过标记的下标说明对应元素存在,否则则不存在,加入ans

C++ 代码:

class Solution {
public:vector<int> findDisappearedNumbers(vector<int>& nums) {int n = nums.size();vector<int> ans;// 遍历数组 加偏移量for(int i = 0; i < n; i++ ){nums[(nums[i] - 1) % n] += n;}for(int i = 0; i < n; i++ ){if(nums[i] <= n)ans.push_back(i + 1);}return ans;}
};

复杂度分析:

  • 时间复杂度:O(n),遍历两次数组
  • 空间复杂度:O(1),原地修改数组

相关文章:

  • 【Django开发】前后端分离美多商城项目第3篇:用户部分,1. 后端接口设计:【附代码文档】
  • 机器学习-04-分类算法-04-支持向量机SVM
  • JNDI注入原理及利用IDEA漏洞复现
  • 小巧玲珑的SQLite
  • Java中的类与对象
  • 笔试总结01
  • 深度学习基础知识概述
  • 【算法】差分、前缀和(重新排序)
  • 外包干了3天,技术明显进步。。。。。
  • Mac玩《幻兽帕鲁》为什么打不开D3DMetal?d3d错误怎么办 d3dxl error
  • 前端结合 react axios 获取真实下载、上传进度
  • Vue3学习日记 Day4 —— pnpm,Eslint
  • 【C++】vector容器初步模拟
  • python初始化二维数据
  • 实体框架EF(Entity Framework)简介
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Cumulo 的 ClojureScript 模块已经成型
  • export和import的用法总结
  • Hibernate【inverse和cascade属性】知识要点
  • HTML-表单
  • Markdown 语法简单说明
  • Mocha测试初探
  • Otto开发初探——微服务依赖管理新利器
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python - 闭包Closure
  • rabbitmq延迟消息示例
  • vue-router 实现分析
  • XForms - 更强大的Form
  • 番外篇1:在Windows环境下安装JDK
  • 实战|智能家居行业移动应用性能分析
  • 物联网链路协议
  • 以太坊客户端Geth命令参数详解
  • 译有关态射的一切
  • zabbix3.2监控linux磁盘IO
  • 函数计算新功能-----支持C#函数
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​Java并发新构件之Exchanger
  • #Spring-boot高级
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #微信小程序:微信小程序常见的配置传旨
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (五)IO流之ByteArrayInput/OutputStream
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)ObjectiveC 深浅拷贝学习
  • .dwp和.webpart的区别
  • .NET 动态调用WebService + WSE + UsernameToken
  • .Net 垃圾回收机制原理(二)
  • .net访问oracle数据库性能问题
  • .NET学习教程二——.net基础定义+VS常用设置