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
Post a Comment