leetcode 219. Contains Duplicate II 存在重复元素 II python3

时间:2020-6-10

题目地址:https://leetcode-cn.com/problems/contains-duplicate-ii/

题目难度:Easy

题目描述:

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。

示例 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


思路1:使用额外的数据结构,字典哈希存储索引并遍历找到小于等于k的

代码段1:通过

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        temp = {}
        number = 0
        for i in nums:
            if i in temp:
                temp[i].append(number)
                number +=1
            else:
                temp[i]  = [number]
                number +=1
        print(temp)
        for j in temp.values():
            if type(j) == list:
                for o in range(len(j) - 1):
                    if(j[o+1] - j[o] <= k):
                        return True
        return False

总结:

  1. 字典真香,得好好用起来
  2. 看下优化的代码,其实不需要存储所有的索引后遍历,只需要边遍历边判断即可
class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        temp = {}
        for index, num in enumerate(nums):
            if num in temp and index - temp[num] <= k:
                return True
            temp[num] = index
        return False


思路2:使用counter哈希进行统计

代码段2:通过

from collections import Counter
class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        temp = Counter(nums)
        for i in temp.items():
            if i[1] >= 2:
                temp2 = []
                num = i[0]
                for index, j in enumerate(nums):
                    if j == num:
                        temp2.append(index)
                for i in range(len(temp2) - 1):
                    if(temp2[i+1] - temp2[i] <= k):
                        return True
        return False

总结:

  1. collection真香
  2. 下边的是优化的,6天前的空间能到100%,现在已经是50%
  3. 1e6 = 1*10^6
from collections import Counter
class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        liabs = 1e6
        temp = Counter(nums)
        for key in temp:
            if temp[key] >= 2:
                temp2 = []
                for i in range(len(nums)):
                    if nums[i] == key:
                        temp2.append(i)
                for j in range(1, len(temp2)):
                    liabs = min(liabs, temp2[j] - temp2[j - 1])
                if(liabs <= k):
                    return True
        return False

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值