这是 LeetCode 上的 219. 存在重复元素 II,
难度为 【简单】
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
输入: nums = [1,2,3,1], k = 3
输出: true
输入: nums = [1,0,1,1], k = 1
输出: true
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
1、找出是否存在,返回true和false即可
2、找出两个不同的索引 i 和 j
3、i和j 满足nums[i]=nums[j]
4、|i-j|<=k
看到数组,要找相同的两个数首先想到的应该是双指针的解法,思路如下
1、定义两个指针left,right
2、left先不动,移动right,使用nums[left]=nums[right]
3、如果|left-right|<=k,那么就找存在,就直接返回
4、如果不满足,则继续移动left、right
5、如果找不到则返回false
总结:两层循环,外层控制left,内层控制right
两层循环,感觉应该不会有多快,时间复杂度有O(n*n)
先代码实现试试
def containsNearbyDuplicate(self, nums, k):
n=len(nums)
for left in range(n-1):
for right in range(left+1,n):
if nums[left]==nums[right] and abs(left-right)<=k:
return True
return False
果不其然,直接超时,AC不了
用一个hash用记录每个元素的索引,如果下个值存在hash中,用hash的值与当前索引求差,看是否满足条件
def containsNearbyDuplicate(self, nums, k):
tmp={}
for i in range(len(nums)):
if nums[i] in tmp and i-tmp[nums[i]]<=k:
return True
tmp[nums[i]]=i
return False
原文:https://www.cnblogs.com/hitechr/p/14986500.html