首页 > 其他分享 >LeetCode #448 找到所有数组中消失的数字

LeetCode #448 找到所有数组中消失的数字

时间:2023-04-12 15:24:36浏览次数:34  
标签:448 num nums int vector 数组 遍历 LeetCode

基本思路

  为了满足题目要求的不使用额外的存储空间(当然返回的数组除外),并且时间复杂度控制在O(n),最多只能常数级别遍历,因此考虑将原数组视作一个"哈希表"。

  遍历原数组,将【1,n】上的值域映射到【0,n-】的坐标上,某个数x扫描到一次则将这个数x映射的 x-1的坐标处的值加上n。

  然后再次遍历原数组,如果某个元素num【i】不超过n则说明这个数对应的映射未被扫描过,i+1则代表缺失的数,可以加入作为结果返回的vector数组中。

标程

 1 class Solution {
 2 public:
 3     vector<int> findDisappearedNumbers(vector<int>& nums) {
 4         int n = nums.size();
 5         for(auto& num : nums){
 6             int x = (num - 1) % n;
 7             nums[x] += n;
 8         }
 9         vector<int>res;
10         for(int i = 0; i < n; i++){
11             if(nums[i] <= n){
12                 res.push_back(i+1);
13             }
14         }
15         return res;
16     }
17 };

时间复杂度

  O(N)

标签:448,num,nums,int,vector,数组,遍历,LeetCode
From: https://www.cnblogs.com/miracle-cst/p/17309892.html

相关文章

  • LeetCode #283 移动零(双指针版本,效率高)
    基本思路思路————双指针初始状态左右指针都指向数组首位元素,然后right指针开始迭代数组,当碰到非0元素则与左指针left所在位置的元素交换。交换完毕后,左指针left则向前移动到下一位置,做好准备迎接下一个非0元素的交换。这种算法效率比之前撰写的“伪双指针”......
  • LeetCode #414 第三大的数
    解题思路数组从大到小排序后,从第2个元素开始遍历,如果与上一个元素不相同,则标志位++,标志位一旦从1加到3(两次)则代表存在第三大的数,即可返回。如若不存在第三大的数,则在遍历结束后,函数末尾返回数组的第一个元素(最大的元素)。标程1classSolution{2public:3intthirdMa......
  • C语言数组基础知识(关于索引)
    #include<stdio.h>intmain(){inti;//遍历输出分别值inta[]={1,2,3,4,5};for(i=0;i<5;i++){printf("%d\t",a[i]);//12345};printf("\n");//若给的值不够就用0补齐......
  • LeetCode #485 最大连续 1 的个数
    解题思路基础题,最后加一个特殊情况处理就好,时间复杂度O(n)代码  classSolution{public:intfindMaxConsecutiveOnes(vector<int>&nums){intcount=0;intMaxcount=0;for(inti=0;i<nums.size();i++){if(nums[i]==1){......
  • 力扣-数组-螺旋矩阵
     题目顺序59螺旋矩阵Ⅱ,解题思路1.按照num从小到大依次填充,遵循从左到右,从上到下,从右到左,从下到上的层循环顺序;2.层循环中要注意,每个部分保持相同的开闭原则,左闭右开或左开右闭防止混淆出错;3.每层循环的start是不同的;每层循环的每部分个数依次减少;4.注意n的奇偶,奇数单独对中......
  • 108. 将有序数组转换为二叉搜索树
    给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过1」的二叉树。classSolution{public:TreeNode*sortedArrayToBST(vector<int>&nums){......
  • 哈希表:剑指 Offer 03. 数组中重复的数字
    题目描述:找出数组中重复的数字。在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。   限制:2<=n<=100000 哈希表/Set利用数据......
  • C语言矩阵顺时针旋转90度和力扣34. 在排序数组中查找元素的第一个和最后一个位置
    #include<iostream>usingnamespacestd;#defineM5#include<stdlib.h>//原矩阵,某元素第n行第m列,;顺时针旋转90度后,位置变成倒数第n列,第m行//即先转置再水平翻转intn=0;voidrotation_90(intmatrix[][M],intn){ for(inti=0;i<n;i++) { for(intj=i;j<M;j++)......
  • #yyds干货盘点# LeetCode面试题:矩阵置零
    1.简述:给定一个 mxn的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。 示例1:输入:matrix=[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例2:输入:matrix=[[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]......
  • 第九篇 手写原理代码 - 数组 【 实现 forEach、map、filter、every、some 】
    1、forEachArray.prototype.my_forEach=function(callback){for(leti=0;i<this.length;i++){callback(this[i],i,this);}};2、mapArray.prototype.my_map=function(callback){constarr=[];for(leti=0;i<this.length;......