Leetcode算法刷题:217和219题 Contains Duplicate

从题目名字就可以看出这两道题是相似的,219是217的加强版

217:Contains Duplicate

题目

给予一个数组,判断是否有重复的元素。如果有就返回True,没有就返回False。以下是我第一次想到的方法

解题思路

遍历这个数组,建立一个字典,存储每个不同的数字的出现次数。如果某个元素的出现次数大于1,则表示有重复

class Solution:
    # @param {integer[]} nums
    # @return {boolean}
    def containsDuplicate(self, nums):
        count = dict()
        for i in range(len(nums)):
            if nums[i] not in count:
                count[nums[i]] = 1
            else:
                count[nums[i]] += 1

        for i in count:
            if count[i] == 1:
                pass
            else:
                return True
        return False

这是我开始的解法,提交时间是82ms。提交后我马上想到了个更快的方法:用set消除冗余, 提交时间55ms,快了很多~

class Solution:
    # @param {integer[]} nums
    # @return {boolean}
    def containsDuplicate(self, nums):
        temp = len(nums)
        s = set(nums)
        if temp == len(s):
            return False
        return True

219: Contains Duplicate II

题目

给予一个数组和一个数字k,判断在这个数组中是否只有一对元素重复,且中间相隔的元素数目不超过k

解题思路

大致思路和217的第一种方法一样,不同的是上一题的字典存储的是元素: 出现次数, 而这时候存储的是元素:[出现次数, 相隔元素个数, 是否有重复元素(布尔值)]

class Solution:
    # @param {integer[]} nums
    # @param {integer} k
    # @return {boolean}
    def containsNearbyDuplicate(self, nums, k):
        count = dict()
        temp = 0
        for i in range(len(nums)):
            if nums[i] not in count:
                count[nums[i]] = [1, i, False]
            else:
                count[nums[i]] = [count[nums[i]][0] + 1, i - count[nums[i]][1], True]

        for i in count:
            if count[i][2]:
                temp += 1
        if temp > 1 or temp == 0:
            return False
                
        for i in count:
            if count[i][1] <= k and count[i][2]:
                return True
        return False

转载于:https://www.cnblogs.com/eric-nirnava/p/leetcode-217and219.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值