Day2——刷leedcode上哈希表相关题目
第二题:
219. 存在重复元素II
题目内容:给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
idea:①暴力解法:用for循环找出值相同的不同索引
②题目是“存在”问题,所以如果有多个相同的值对应的索引只要有一个满足<=k就True,因此需要把所有满足条件的abs(i - j) 保留并找出最小与k比较。
解法1:
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
diff=[]
for i in range(len(nums)):
for j in range(len(nums)):
if i != j :
if nums[i]==nums[j]:
diff.append(abs(i-j))
if diff == []:
return False
else:
if min(diff)<=k:
return True
else:
return False
运行结果:
![](https://img-blog.csdnimg.cn/641459b67a28437eaea5571addd272be.png)
好好好,leedcode超时没通过,需要降低时间复杂度
解法2:
enumerate(sequence,开始下标) 函数是内置函数,可将一个可迭代对象(如列表)组合为一个索引序列,同时返回索引和对应的元素。
帮助理解的带代码:
nums=[1,0,1,1] list(enumerate(nums),0) 输出:[(0, 1), (1, 0), (2, 1), (3, 1)] |
解法代码:
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
num_dict = {} # 使用字典来存储数字及其最近出现的索引
for i, num in enumerate(nums):
if num in num_dict and i - num_dict[num] <= k:
return True
num_dict[num] = i
return False