这是 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