存在重复元素 II(简单题)

题目描述:

给定一个整数数组和一个整数 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;
    };

写的真的好,以后向这个看齐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值