目录
  • 一、题目描述
  • 二、思路分析
    • 方法一:构建哈希表
    • 方法二:双指针
  • 三、总结

    一、题目描述

    题目内容:

    python数组中的 k-diff 数对例题解析

    题目示例:

    python数组中的 k-diff 数对例题解析

    题目解析:

    • 1 <= nums.length <= 104
    • -107 <= nums[i] <= 107
    • 0 <= k <= 107

    二、思路分析

    我们拿到本题,读取题意要求在一组整数数组中,求出差值为k的数对对数k-diff。在思考如何解答该题之前,需要明确如下几点细节:

    • nums数组元素都是整数
    • 索引位置i与位置j,不能相等
    • k-diff数对关系:nums[i] – nums[j] = k -> nums[i] = nums[j] + k -〉 nums[i] – k = nums[j]
    • k-diff数对,存在相同数对情况,但结果只取1次

    因此,我们的对题目中进行详细了解了,因为会排除重复的数对,我们很容易想哈希表来构建

    方法一:构建哈希表

    根据上述思路,我们使用python代码能快速实现,代码如下:

    class Solution(object):
        def findPairs(self, nums, k):
            """
            :type nums: List[int]
            :type k: int
            :rtype: int
            """
            ans = set()
            numset = set()
            for num in nums:
                if num - k in numset:
                    ans.add(num-k)
                if num + k in numset:
                    ans.add(num)
                numset.add(num)
            return len(ans)
    • 数对中重复场景如示例一中差值为k=1,(1,3) & (3,1)视为一种情况,则要定义两个哈希表来储存
    • 哈希表可以通过字典k-value或者集合set(),本题无需考虑索引关系定义ans,numset两个集合
    • 当 nums[i] > nums[j],则nums[j] = nums[i] – k在numset中,取最小的那一个则ans.add(nums[i]-k),
    • 当 nuns[i] < nums[j],则nums[j] = nums[i] + k 在numset中,取较小的那一个则ans.add(nums[i])

    方法二:双指针

    python数组中的 k-diff 数对例题解析

    根据上述思路,使用python代码实现,代码如下:

    class Solution(object):
        def findPairs(self, nums, k):
            """
            :type nums: List[int]
            :type k: int
            :rtype: int
            """
            nums.sort()
            ans = 0
            j = 0
            for i in range(len(nums)):
                if i == 0 or nums[i] != nums[i-1]:
                    while j < len(nums) and (nums[j] < nums[i] + k or j <= i):
                        j +=1
                    if j < len(nums) and nums[j] == nums[i] + k:
                        ans +=1
            return ans
    • 首先对nums数组中的元素按照从低到高的顺序排列
    • 在递增的数组中,由于双指针 i!=j,因此i指针一定是小于j的
    • 枚举查找的判断的条件 nums[j] < nums[i]+k,指针j则往后移动
    • 当nums[j] = nums[i] + k 时,则对数次数+1

    三、总结

    本题可以使用哈希方法要使用两个哈希表,属于牺牲空间换取效率。双指针方法,虽然没有用额外的空间,但是速度较于方法一慢一点。

    我们用第一种方法,AC提交记录如下:

    python数组中的 k-diff 数对例题解析

    • 时间复杂度O(n),n为nums长度
    • 空间复杂度O(n),需要使用哈希表,n为nums长度
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。