原地哈希
1. 题目描述
题目
给定一个长度为n的数组nums,所有元素都在0~n-1的范围内,找出数组中重复的值(任意一个即可)
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
2. 题目思路和代码实现
注意点:要问时间复杂度和空间复杂度
-
时间O(n) 空间O(n) --> 利用哈希表
只要该数字在哈希表中出现过,就返回该数字
def findRepeatNumber(self, nums: List[int]) -> int: dic = dict() for i in nums: if dic.get(i,-1) == -1: #如果i不在dic里面会返回-1 dic[i] = 1 else: # 说明i在dic里面 return i
-
时间O(n) 空间O(1) --> 原地哈希
原地哈希是指直接将原数组当成哈希表,不额外开辟空间。
适用条件:原数组中所有数字范围都不超过数组长度
思想是:遍历整个数组,只要遍历到的数字不在与之对应的下标上,就将其放到对应的下标上(nums[i] 放在 i ),如果对应的下标已经放了nums[i],说明有重复,则返回该值。
def findRepeatNumber(self, nums: List[int]) -> int: n = len(nums) for i in range(n): # 遍历每个位置 while nums[i] != i:# 只要该位置放的数字不符合,由于是交换的方式,不一定交换得来的数字就是符合条件的,不符合条件的话还需要继续交换 if nums[nums[i]] == nums[i]: # 如要要换去得到地方已经有人了 return nums[i] nums[nums[i]], nums[i] = nums[i], nums[nums[i]] # 将nums[i]交换到正确的地方 return nums
3. 学到的知识点:
- 原地哈希的使用
- 两个元素交换,Python可以这么写:\(a,b = b,a\)