缺失数字&数组中重复的数字

如题所述

第1个回答  2022-06-08

给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

示例 1:

示例 2:

示例 3:

方法一:哈希表
先将数组中出现的元素都加入到hash表中,在判断1~n+1是否在hash表中出现过,没有出现即为缺失的元素

方法二:原地哈希

交换

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

示例 1:

示例 2:

方法一:哈希

方法二:排序

方法三:异或
我们知道数组中有 n 个数,并且缺失的数在 [0..n] 中。因此我们可以先得到 [0..n] 的异或值,再将结果对数组中的每一个数进行一次异或运算。未缺失的数在 [0..n] 和数组中各出现一次,因此异或后得到 0。而缺失的数字只在 [0..n] 中出现了一次,在数组中没有出现,因此最终的异或结果即为这个缺失的数字。

方法四:和
用0~n之后减去数组元素之后得到缺失的数字

五:原地哈希

后来想到的方法:交换

给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。

找到所有在 [1, n ] 范围之间没有出现在数组中的数字。

您能在不使用额外空间且时间复杂度为 O(n) 的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

示例:

方法一
先将应该出现的数字存入set中,再遍历数组,将出现的数字从set中移除,set中剩下的数字即为消失的数字

方法二
遍历输入数组的每个元素一次
将把 |nums[i]|-1 索引位置的元素标记为负数。即 nums[∣nums[i]∣−1]×−1 。
然后遍历数组,若当前数组元素 nums[i] 为负数,说明我们在数组中存在数字 i+1

交换的方法

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 :

方法一:Set
遍历数组,在遍历过程中将遇到的元素存起来,如果发现当前遇到的元素已经存在过就返回

方法二:排序

方法三:原地修改
由于数字都在0~n-1范围内,考虑num可以看做数组索引,遍历过程中将索引位置设为负数,如果下次索引位置为负数说明出现了相同的元素。由于存在0,需要特殊处理

原地交换
遍历中,第一次遇到数字 x 时,将其交换至索引 x 处;而当第二次遇到数字 x 时,一定有 nums[x] = nums[x]=x ,此时即可得到一组重复数字