小鱼刷leetcode---532. 数组中的 k-diff 数对

48 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

一 描述

532. 数组中的 k-diff 数对 - 力扣(LeetCode)

给你一个整数数组 nums 和一个整数 k,请你在数组中找出 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。

k-diff 数对定义为一个整数对 (nums[i], nums[j]) ,并满足下述全部条件:

  • 0 <= i, j < nums.length
  • i != j
  • nums[i] - nums[j] == k

注意,|val| 表示 val 的绝对值。

 

示例 1:

输入:nums = [3, 1, 4, 1, 5], k = 2
输出:2
解释:数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个 1 ,但我们只应返回不同的数对的数量。

示例 2:

输入:nums = [1, 2, 3, 4, 5], k = 1
输出:4
解释:数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5) 。

示例 3:

输入:nums = [1, 3, 1, 5, 4], k = 0
输出:1
解释:数组中只有一个 0-diff 数对,(1, 1) 。

 

提示:

  • 1 <= nums.length <= 10^4
  • -10^7 <= nums[i] <= 10^7
  • 0 <= k <= 10^7

二 分析

现在看到这类题,会想到用双指针来做了。

首先排序,i和j分别指向第一和第二个元素(如果仅有一个元素根据题意返回0)

如果差大/小于k,移动较小/大的指针,直到指向的元素不同。

如果差等于k,更新计数,移动两个指针直至指向的元素都不同。

如果指向了同样的元素,后移较大指针。

三 答案

class Solution {
public:
    int findPairs(vector<int>& nums, int k) {
        if(nums.size() == 1) return 0;
        sort(nums.begin(),nums.end());
        int i = 0 , j = 1;
        int count = 0;
        while(j < nums.size()) {
            if(nums[j] - nums[i] < k) {
                ++j;
                while(j < nums.size() && nums[j] == nums[j-1]) ++j;
            }
            else if(nums[j] - nums[i] == k) {
                ++count;
                ++i;
                ++j;
                while(i < nums.size() && nums[i] == nums[i-1]) ++i;
                while(j < nums.size() && nums[j] == nums[j-1]) ++j;
            }
            else {
                ++i;
                while(i < nums.size() && nums[i] == nums[i-1]) ++i;
            }
            if(i == j) ++j;
        }
        return count;
    }
};

四 参考

532.数组中的k-diff数对 Python&Java 哈希表、双指针双解 - 数组中的 k-diff 数对 - 力扣(LeetCode)

双解数组中的k-diff数对:[哈希表] + [排序双指针] - 数组中的 k-diff 数对 - 力扣(LeetCode)