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

本文总结了LeetCode中利用原地哈希法解决数组内重复数字和缺失数字的问题,包括面试题03. 数组中重复的数字、LeetCode 41. 缺失的第一个正数、442. 数组中重复的数据和448. 找到所有数组中消失的数字。核心思想是通过数组元素的值与其下标之间的对应关系,实现快速查找和定位。
摘要由CSDN通过智能技术生成

同类型问题

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),并且只能使用常数级别的额外空间

这道题涉及负数,首先需要把所有负数处理之后,才能再按照上面的思路整理数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值