📜  差异小于K的对(1)

📅  最后修改于: 2023-12-03 15:25:24.863000             🧑  作者: Mango

差异小于K的对

差异小于K的对是指给定一个整数数组,在数组中找到所有差的绝对值小于等于K的数对。例如,对于数组 [1, 3, 5, 6, 9] 和 K=2,符合条件的数对有(1, 3), (1, 5), (3, 5), (5, 6), (6, 9)。

算法实现

我们可以使用双指针法来求解差异小于K的对。双指针法需要我们首先对数组进行排序,然后维护两个指针i和j,i从数组头开始,j从i+1开始,每个指针都向右移动,如果 nums[j]-nums[i] > k,那么i指针向右移动,如果 nums[j]-nums[i] <= k,则加入符合条件的数对 (nums[i], nums[j]),j指针向右移动。

下面是一个示例代码实现:

def findPairs(nums, k):
    nums.sort()
    i, j = 0, 1
    result = []
    while i < len(nums) and j < len(nums):
        if i == j or nums[j] - nums[i] < k:
            j += 1
        elif nums[j] - nums[i] > k:
            i += 1
        else:
            result.append((nums[i], nums[j]))
            i += 1
            while i < len(nums) and nums[i] == nums[i-1]:
                i += 1
    return result
算法分析

双指针法的时间复杂度为 $O(n\log n)$(排序的复杂度),空间复杂度为 $O(1)$。因为我们需要对数组排序,所以我们需要占用额外 $O(n)$ 的空间。

总结

差异小于K的对问题在面试中经常被提及。我们可以使用双指针法来解决此问题。我们需要首先对数组进行排序,然后在数组上维护两个指针i和j,每个指针都向右移动。如果 nums[j]-nums[i] > k,则需要将i指针向右移动;如果 nums[j]-nums[i] <= k,则加入符合条件的数对 (nums[i], nums[j]),然后j指针向右移动。最终,我们就能够得到所有差异小于K的数对。