532 K-diff Pairs in an Array

1. Question

Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in the array. Here a k-diff pair is defined as an integer pair (i, j), where i and j are both numbers in the array and their absolute difference is k.

Example 1:

Input: [3, 1, 4, 1, 5], k = 2

Output: 2

Explanation: 
There are two 2-diff pairs in the array, (1, 3) and (3, 5).

Although we have two 1s in the input, we should only return the number of unique pairs.

Example 2:

Input: [1, 2, 3, 4, 5], k = 1

Output: 4

Explanation: There are four 1-diff pairs in the array, (1, 2), (2, 3), (3, 4) and (4, 5).

Example 3:

Input: [1, 3, 1, 5, 4], k = 0

Output: 1

Explanation: There is one 0-diff pair in the array, (1, 1).

Note:

  1. The pairs (i, j) and (j, i) count as the same pair.

  2. The length of the array won't exceed 10,000.

  3. All the integers in the given input belong to the range: [-1e7, 1e7].

2. Implementation

(1) Two Pointers

思路: 首先将nums数组排序,然后设立双指针,判断nums[end] - nums[start]与k的大小关系:

  • 当nums[end] - nums[start] < k时,end往右移一位。为了避免start和end指向同一个数,所以当start等于end时,end也要往右一位

  • 当nums[end] - nums[start] > k时,start往右一位

  • 当nums[end] - nums[start] == k时,我们得到一个解。由于题目要求k -diff是unique的,所以这时我们还要跳过所有和nums[start]一样的数字,这个操作可能会导致start > end,所以此时我们还要将end指向end + 1和start + 1两者的较大值。指向end + 1是因为当得到一个有效解后,end的指针位置也要更新。指向start + 1是因为end始终要在start后面

class Solution {
    public int findPairs(int[] nums, int k) {
        if (nums == null || nums.length <= 1 || k < 0) {
            return 0;
        }

        int start = 0, end = 1;
        int n = nums.length, count = 0;

        Arrays.sort(nums);

        while (start < n && end < n) {
            if (start == end || nums[end] - nums[start] < k) {
                ++end;
            }
            else if (nums[end] - nums[start] > k) {
                ++start;
            }
            else {
                ++count;
                ++start;

                while (start < n && nums[start - 1] == nums[start]) ++start;
                end = Math.max(end + 1, start + 1);
            }
        }
        return count;
    }
}

(2) HashMap

public class Solution {
    public int findPairs(int[] nums, int k) {
        if (nums == null || nums.length == 0 || k < 0) {
            return 0;
        }

        Map<Integer, Integer> map = new HashMap<>();

        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }

        int count = 0;

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (k == 0) {
                if (entry.getValue() >= 2) {
                    ++count;
                }
            }
            else {
                if (map.containsKey(entry.getKey() + k)) {
                    ++count;
                }
            }
        }
        return count;
    }
}

3. Time & Space Complexity

Two Pointers: 时间复杂度O(nlogn), 空间复杂度O(1)

HashMap:时间复杂度O(n), 空间复杂度O(n)

Last updated

Was this helpful?