一. 题目
给定一个整数数组和一个整数 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
二. 思路
除了要找到两个相同的数以外,还要求这两个数的index差值不超过k,其实还是用hash,只不过此时的value不能像217题那样,再存出现的次数,而是要记录index。这里要注意一旦两个相同的数出现,但是index超出了k,那么我们要更新这个value,使之成为最新的index,因为不更新的话再出现相同的数字,只会差值越大。
参考:https://blog.csdn.net/u014251967/article/details/52468659
class Solution(object):
def containsNearbyDuplicate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
hash_dict = {}
for i, v in enumerate(nums):
if v in hash_dict:
if abs(hash_dict[v] - i) <= k:
return True
else:
hash_dict[v] = i
else:
hash_dict[v] = i
return False
基本上用时较少的范例都用的这个思路,他们用的for循环形式略微有差异(xrange,range,enumerate)
两个可以改进的点:1.if 的判断可以用and来连接。2. else可以不用写,直接把下面的语句反缩进出来。