原地哈希

1. 题目描述

题目
给定一个长度为n的数组nums,所有元素都在0~n-1的范围内,找出数组中重复的值(任意一个即可)

输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

2. 题目思路和代码实现

注意点:要问时间复杂度和空间复杂度

  1. 时间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
    
  2. 时间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. 学到的知识点:

  1. 原地哈希的使用
  2. 两个元素交换,Python可以这么写:\(a,b = b,a\)
posted @ 2022-05-19 17:08  要兵长还是里维  阅读(292)  评论(0编辑  收藏  举报