题目
难度:★★☆☆☆
类型:数组
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
示例
示例 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
解答
这里,我们用字典(哈希表)来解决这个问题:
定义一个字典,字典中的键是数组中的某个元素,字典中的值是遍历到当前为止最近的元素所在的位置;
遍历数组,不断查看当前元素是否之前遍历过的元素中出现过,通过查看当前元素是否在字典键中即可得到,如果存在过,再判断最近的位置(字典中该元素所对应的值)与当前位置的差距是否超过了阈值k,如果没有,则说明找到了题目要求的重复元素,否则,说明当前元素没有出现过或者出现位置离当前太远,应该加入或更新当前元素及其位置到字典中;
如果遍历结果仍然没有找到符合要求的重复元素,则直接返回False。
class Solution:
def containsNearbyDuplicate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
if len(nums) <= 1: # 如果输入数组为空或只有一个元素
return False # 一定不存在重复
latest_appear = {} # 创建空字典
for i in range(len(nums)): # 遍历数组
# 如果当前数字出现过并且之前出现的位置且当前位置差小于阈值k
if nums[i] in latest_appear and i-latest_appear[nums[i]] <= k:
return True # 满足条件返回True
# 没有出现过或者出现位置离当前太远,则加入或更新当前元素及其位置到字典中
latest_appear[nums[i]] = i
return False # 没有找到合适条件,返回False
如有疑问或建议,欢迎评论区留言~