Leetcode 数组原地哈希问题大总结

同类型问题

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:
    

你可能感兴趣的:(Leetcode)