题目描述:
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
示例描述:
题目分析:
要求我们找到数组中的重复元素,并且将这两个重复元素的索引差取绝对值之后不大于k,如果只是分析到这里,这道题目肯定是会错误的,他其实有几个隐含的条件:比如说条件一:当没有重复元素的时候,返回的是false;条件二,当有多个数组元素的值相等时,一定要取索引值最小的那一个,可以看到示例图第二个的描述;最抗人的就是这个了,如果你分析题目的时候不仔细,那么恭喜你,你在写的时候肯定会出问题
代码思路:
首先判断是否有重复的,如果有重复的,那么开始找相同的索引值,如果相同的数组值有多个,那么索引值一定要找到最小的那一个,比较索引值是否小于等于k,如果是,返回true,如果不是,返回false
代码如下:
var containsNearbyDuplicate = function(nums, k) {
let n =-1;let num =120
let map =new Map()
for(let i of nums){
if(map.has(i)){
n=1
break
}else{
map.set(i,1)
}
}
if(n !=-1){
for(var i=0;i<nums.length;i++){
for(var j=i+1;j<nums.length;j++){
if(nums[i] ===nums[j]){
if(num>j-i){
num =j-i
}
}
}
}
if(num <=k) return true
else return false
}else return false
};
代码解析:
首先判断是否有重复,使用哈希函数,如果有,就开始新的判断,如果没有,那么就直接返回false,在判断的时候,使用暴力循环,不断地判断是否有相同数组值,有的话找出差值与k作比较,大于返回false,小于等于返回true
虽然自己做出来了,但是自己写的代码有一说一,真的不行,时间复杂度太高了,我当时提交的时候以为会超时,索性没有超时,但是问题也很严重,时间太久了,所以看了一下别人的,发现做的是真的很好,发出来一起欣赏一下(最搞的是,我其实想到这种方法了,但是无法实现,还是数据结构没有学习扎实)
var containsNearbyDuplicate = function(nums, k) {
const set = new Set();
// 遍历数组
for(let i = 0; i < nums.length; i++) {
// 如果集合中存在当前数,证明存在nums [i] = nums [j],则返回true
if(set.has(nums[i])) {
return true;
}
// 否则加入集合
set.add(nums[i]);
// 若集合元素数量多于k,则删除最先来的
if(set.size > k) {
set.delete(nums[i - k]);
}
}
return false;
};
写的真的好,以后向这个看齐