给定一个整数数组和一个整数 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
解法一:
使用2个 for 循环超时了,因为时间复杂度是 O(n^2) ,特别是数组 nums 非常大 而 k 等于 nums.length-2时,执行时间会非常长。
最终使用1个 for 循环加 IndexOf() 查找,总算通过了。不过看效率好像也不高啊
var containsNearbyDuplicate = function(nums, k) {
for( var i=0;i<nums.length;i++) {
var pos = nums.indexOf(nums[i],i+1)
if(pos==-1){
continue;
}else if(pos<=i+k){
return true;
}
}
return false;
};
执行用时:2292 ms
已经战胜 20.91 % 的 javascript 提交记录
解法二:
使用哈希表,var hash={key1:8 , key2: 10}
哈希表的 key = i , val=数组索引,当前索引 i 减去哈希表的索引 val 小于等于 k,返回 true
意想不到竟然速度比前面快落么多。
var containsNearbyDuplicate = function(nums, k) {
var hash={}
for( var i=0;i<nums.length;i++) {
if(hash[nums[i]]==undefined){
hash[nums[i]]=i
}else if(i-hash[nums[i]]>k){
hash[nums[i]]=i
}else{
return true;
}
// console.log(hash)
}
return false;
};
执行用时:100 ms
已经战胜 82.51 % 的 javascript 提交记录