K-diff Pairs in an Array Java

 Given an array of integers nums and an integer k, return the number of unique k-diff pairs in the array.


A k-diff pair is an integer pair (nums[i], nums[j]), where the following are true:


0 <= i, j < nums.length

i != j

|nums[i] - nums[j]| == k

Notice that |val| denotes the absolute value of val.


 


Example 1:


Input: nums = [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: nums = [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: nums = [1,3,1,5,4], k = 0

Output: 1

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



Approach Using Binary Search :n logn

import java.util.Arrays;

class Solution {
    public int findPairs(int[] nums, int k) {
        if (k < 0) return 0;  // No valid pair for negative k

        Arrays.sort(nums);  // Binary search needs sorted array
        int n = nums.length;
        int count = 0;

        for (int i = 0; i < n - 1; i++) {
            // Skip duplicates of nums[i] to avoid duplicate pairs
            if (i > 0 && nums[i] == nums[i - 1]) continue;

            int target = nums[i] + k;
            int start = i + 1;
            int end = n - 1;

            // Binary search for nums[i] + k
            while (start <= end) {
                int mid = start + (end - start) / 2;

                if (nums[mid] == target) {
                    count++;
                    break; // Found a unique pair, move to next i
                } else if (nums[mid] < target) {
                    start = mid + 1;
                } else {
                    end = mid - 1;
                }
            }
        }

        return count;
    }
}

Optimise : 2 pointer 


import java.util.Arrays;

class Solution {
    public int findPairs(int[] nums, int k) {
        if (k < 0) return 0;

        Arrays.sort(nums);
        int start = 0, end = 1, count = 0;
        int n = nums.length;

        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++;
                end++;

                // ✅ Skip duplicates for 'start' safely
                while (start < n && start > 0 && nums[start] == nums[start - 1]) {
                    start++;
                }
            }
        }

        return count;
    }
}


Comments

Popular posts from this blog

Two Sum II - Input Array Is Sorted

Comparable Vs. Comparator in Java

Increasing Triplet Subsequence