K-diff Pairs in an Array

leetcode第532题,竞赛题,虽然标签是easy,结果我想了很长时间,而且代码相当繁琐,不过我这里没有使用hashset之类可以自动去重的工具,除了使用了map之外,其余的都是正常的逻辑了。

一点点分析,首先,如果k是个负数,则可以直接返回0.
接下来k就要分情况了,分成k是0和不是0的情况,这样做确实很繁琐,但是可以通过测试样例。
使用一个字典记录已经用到的数,另一个字典记录绝对值差为k的那些数,一边遍历一边搜索。注意,这里要记录出现绝对值差k数的频次,一旦有可以匹配的,就直接加上这个数目。另外,为了防止重复,有两个措施,一个是记录已经用到的数,如果再次出现再处理,另外针对k为0的情况,为了防止加入两遍绝对差为k的数,还要单独处理。

总之去重是个很繁琐的工作,也不敢保证还有没有遗漏的情况。

class Solution(object):
    def findPairs(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        dNum = {}
        n = len(nums)
        d = {}
        ans = 0
        if k < 0:
            return 0
        else:
            for i in range(n):
                if k == 0:
                    if nums[i] in d and d[nums[i]] != 0:
                        ans += d[nums[i]]
                        d[nums[i]] = 0
                else:
                    if nums[i] in d and d[nums[i]] != 0 and nums[i] not in dNum:
                        ans += d[nums[i]]
                        d[nums[i]] = 0
                if nums[i] not in dNum:
                    if k == 0:
                        if nums[i] - k not in d:
                            d[nums[i] - k] = 1
                        else:
                            d[nums[i] - k] += 1
                    else:
                        if nums[i]-k not in d:
                            d[nums[i]-k] = 1
                        else:
                            d[nums[i]-k] += 1
                        if nums[i]+k not in d:
                            d[nums[i]+k] = 1
                        else:
                            d[nums[i]+k] += 1
                dNum[nums[i]] = 1
                #print d
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值