同类型问题
Leetcode中一类问题是数组范围(0,N)找寻重复数字或者消失的数字
- 面试题03. 数组中重复的数字
- Leetcode 41. 缺失的第一个正数
- Leetcode 442. 数组中重复的数据
- Leetcode 448. 找到所有数组中消失的数字
数组哈希法中心思想
由于数组元素的值都在指定的范围内,这个范围恰恰好与数组的下标可以一一对应;
因此看到数值,就可以知道它排序后应该放在什么位置
即大小为 i 的数字排序后应该在下标为 i 的位置上,这就像是人为编写了哈希函数
而找到重复的数就是发生了哈希冲突,或者哪个位置不存在缺失的就是哪个位置
如果数组中0是有用的,那么需要一步一步置换、
如果数组中0是不存在的或者无用的,那么只需要用负号记录出现的数字的位置即可
这种方法能够实现原地置换
时间复杂度:O(N)
空间复杂度:O(1)
例题代码
面试题03. 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
交换nums[i]和nums[nums[i]]时注意nums[i]的值变化不能直接交换,要记录初始的nums[i]的值最后一句使用。
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
i = 0
while True:
if nums[i] == i:
i += 1
continue
if nums[i] == nums[nums[i]] :
return nums[i]
else:
tmp = nums[i]
nums[i] = nums[nums[i]]
nums[tmp] = tmp
Leetcode 41. 缺失的第一个正数
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
例子:输入: [3,4,-1,1] 输出: 2
复杂度应为O(n),并且只能使用常数级别的额外空间
这道题涉及负数,首先需要把所有负数处理之后,才能再按照上面的思路整理数组