Day 1:HashSet 入门(判重、存在性)
-
- 存在重复元素
-
- 存在重复元素 II
-
- 快乐数
-
- 只出现一次的数字
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()