给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
示例 1:
输入: [1,2,3,1], k = 3
输出: true
示例 2:
输入: [1,0,1,1], k = 1
输出: true
示例 3:
输入: [1,2,1], k = 0
输出: false
解题思路
我们首先想到的解法就是通过暴力破解。通过遍历nums
找出师傅哦有满足条件的数对,判断数对之间的距离是不是<=k
。
class Solution:
def containsNearbyDuplicate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
for i, a in enumerate(nums):
for j, b in enumerate(nums):
if i != j and a == b:
if abs(i - j) <= k:
return True
return False
我们可以参考这篇文章Leetcode 209:长度最小的子数组(最详细解决方案!!!)中提到的滑动窗口解决这个问题
我们通过建立一个record
查找表,表中存的是窗口中的数,另外我们要注意的是,当窗口的大小>k
的时候,我们要移除record
中最左边的元素(保证我们窗口中有<=k
个数)
class Solution:
def containsNearbyDuplicate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
record = set()
for i, num in enumerate(nums):
if num in record:
return True
record.add(num)
if len(record) == k + 1:
record.remove(nums[i - k])
return False
我们分析这个算法的时间复杂度,这个算法的时间复杂度是O(n)
这个级别的。如果我们查找表选用dict
,有该怎么做呢?我们的key
是nums
中的元素,而value
是对应元素在nums
中的位置。
class Solution:
def containsNearbyDuplicate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
record = {}
for i, num in enumerate(nums):
if num in record and i - record[num] <= k:
return True
record[num] = i
return False
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!