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:
- The pairs (i, j) and (j, i) count as the same pair.
- The length of the array won't exceed 10,000.
- All the integers in the given input belong to the range: [-1e7, 1e7].
思路:由于有重复元素,要考虑去重,因此需要排序。对排好序的元素以i、j判断差值大小,进而调整i、j位置。
class Solution { public int findPairs(int[] nums, int k) { int len = nums.length; if(len <= 0) return 0; Arrays.sort(nums); int i = 0,j = 0; int result = 0; int preI = Integer.MIN_VALUE; int preJ = Integer.MIN_VALUE; while(i < len && j < len){ while(( i == j )||(preI == nums[i] )&&( preJ == nums[j])){ j++; if(i >= len || j >= len) return result; } long temp = Math.abs((long)nums[i] - (long)nums[j]);//防止溢出 if(temp == k){ result ++; preI = nums[i]; preJ = nums[j]; i++; }else if(temp < k){ preJ = nums[j]; j++; }else{ preI = nums[i]; i++; } } return result; } }