数组中的 k-diff 数对

简介: 我们拿到本题,读取题意要求在一组整数数组中,求出差值为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次

一、题目描述:

题目内容

题目示例

题目解析

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次

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

方法一:构建哈希表

数对中重复场景如示例一中差值为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代码能快速实现,代码如下:
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)

复制代码

方法二:双指针

首先对nums数组中的元素按照从低到高的顺序排列
在递增的数组中,由于双指针 i!=j,因此i指针一定是小于j的
枚举查找的判断的条件 nums[j] < nums[i]+k,指针j则往后移动
当nums[j] = nums[i] + k 时,则对数次数+1

根据上述思路,使用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

相关文章
|
算法
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
107 0
|
6天前
将奇数数组与偶数数组合并为一个数组
【10月更文挑战第29天】将奇数数组与偶数数组合并为一个数组。
15 4
数组求最大值和最小值的方法,数组写最大值和最小值的三元写法,数组取最小值,如何在数组中添加最后一个值,arr.push()添加数组放到后面,arr.unshift(‘red‘)添加的放到前面
数组求最大值和最小值的方法,数组写最大值和最小值的三元写法,数组取最小值,如何在数组中添加最后一个值,arr.push()添加数组放到后面,arr.unshift(‘red‘)添加的放到前面
|
5月前
|
C++
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
|
6月前
|
人工智能
PTA-将数组中的数逆序存放
将数组中的数逆序存放
52 0
剑指offer JZ37数字在排序数组中出现的次数
剑指offer JZ37数字在排序数组中出现的次数
46 0
|
算法 C++
剑指offer(C++)-JZ40:最小的K个数(算法-排序)
剑指offer(C++)-JZ40:最小的K个数(算法-排序)
Problem: 2770. 达到末尾下标所需的最大跳跃次数
Problem: 2770. 达到末尾下标所需的最大跳跃次数
42 0
|
Java 测试技术 C++
LeetCode 69. Sqrt(x)--(数组)--二分法查找 --简单
Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a non-negative integer. Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
127 0
LeetCode 69. Sqrt(x)--(数组)--二分法查找 --简单
LeetCode——532. 数组中的 k-diff 数对
LeetCode——532. 数组中的 k-diff 数对
79 0