LeetCode 哈希表刷题清单-Day1

6 阅读3分钟

Day 1:HashSet 入门(判重、存在性)

    1. 存在重复元素
    1. 存在重复元素 II
    1. 快乐数
    1. 只出现一次的数字

217. 存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

对于数组中每个元素,我们将它插入到哈希表中。如果插入一个元素时发现该元素已经存在于哈希表中,则说明存在重复的元素。

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        s = set()
        for v in nums:
            if v in s:
                return True
            s.add(v)
        return False

219. 存在重复元素 II

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

将元素和对应的位置插入到dict中,key为元素值,value为元素的位置,不断插入元素,如果发现dict存在相同元素,比较当前位置与历史位置的距离。如果元素当前位置i与历史位置j相差大于k,则下一个位置i'与j的位置也一定大于k,因为随着遍历有j<i<i'

核心思想就是找到两个相同的数,然后判断位置坐标,使用dict存储

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        num_to_pos = {}
        for i, num in enumerate(nums):
            if num in num_to_pos: # 找到了一个相同的值
                j = num_to_pos[num]
                if abs(i - j) <= k :
                    return True
            num_to_pos[num] = i
        return False

202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。 如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

没有想到怎么判断是否会有循环,联想到hash题才有猜测

如果平方和组成的新数之前已经存在过,那么说明从这个数开始后面就要开始新的一个循环了。例如v1->v2->v3->v4->v1。如果碰到了循环那就直接返回false

class Solution:
    def isHappy(self, n: int) -> bool:
        hs = set()
        while True:
            s = 0
            # 拆解成每个位置,计算平方和
            while n > 0:
                i = n % 10
                s += i * i
                n = n // 10
            # 如果结果为1,则跳出
            if s == 1:
                return True
            # 如果之前已经存在,说明后续要开始循环了
            if s in hs:
                return False
            hs.add(s)
            n = s

136. 只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

我们统计每个数出现的次数即可,由于只有一个元素出现一次,其他元素都出现两次。如果某个数之前已经出现过了,那么这个数后面肯定不会出现了,并且也不是我们想要的,删除这个数即可。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        s = set()
        for num in nums:
            if num in s:
                s.remove(num)
            else:
                s.add(num)
        return s.pop()