存在重复元素Ⅱ python3

问题描述

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true

示例 2:
输入:nums = [1,0,1,1], k = 1
输出:true

示例 3:
输入:nums = [1,2,3,1,2,3], k = 2
输出:false

解题思路

哈希表结构,key存储数字,value存储该数字出现的索引,且value为列表结构。若当前数字对应的列表长度大于2,则表明至少存在相同的两个索引,使得nums[i] == nums[j],将此列表降序排列,一一比较,如存在i-j小于等于k则返回True。

代码实现

def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        my_dict ={}
        index = 0
        for num in nums:
            if num not in my_dict.keys():
                my_dict.setdefault(num,[]).append(index)
            else:
                my_dict[num].append(index)
            index+=1
        print(f"my_dict:{my_dict}")
        keys = my_dict.keys()
        for i in keys:
            if len(my_dict[i])>=2:
                sorted_dict_list = sorted(my_dict[i], reverse = True)
                n = len(my_dict[i]) 
                u = 0
                while u <n:
                    j = n-1
                    while j >u:
                        if sorted_dict_list[u]-sorted_dict_list[j]<=k:
                            return True
                        else:
                            j-=1
                    u+=1
        return False

复杂度

时间复杂度:O(NLogN)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值