力扣:力扣
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true
示例 2:
输入:nums = [1,0,1,1], k = 1
输出:true
示例 3:
输入:nums = [1,2,3,1,2,3], k = 2
输出:false
提示:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
0 <= k <= 105
示例代码1: 【滑动窗口+哈希表】
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
s = set()
for i in range(len(nums)):
if i > k:
s.remove(nums[i-k-1])
if nums[i] in s:
return True
s.add(nums[i])
return False
思路解析:
示例代码2:【哈希】
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
#哈希表保存数字和相应的索引
hash_ = {}
for index, num in enumerate(nums):
#如果数字已经存在于哈希表中了,就将现在的索引和之前的索引相减检查是否满足条件
if num in hash_:
if index - hash_[num] <= k:
return True
#数字存在但是索引相减不满足条件,就更新这个数字的索引于最近的一项,保证再次遇到相同的数字能有最小的索引相减值
hash_[num] = index
#如果不存在这个数字,加入哈希表
hash_[num] = index
#如果循环结束了仍然没有满足条件的,则不存在这样的数字,返回False
return False