Buttercola: Zenefits: Two Minus
在一个整数数组中(有重复元素)找出有多少对,满足条件:他们的差等于k。例如[1,5,5,2,4,6,7],k=3,满足条件的对子有[1,4], [2,5], [2,5](注意有两个5),[4,7],所以程序返回4。这题比较tricky的地方在于k=0的情况需要另外考虑一下。
Solution:
1. Sort the array
2. Maintain two pointers, lo and hi, points to index 0 and 1, respectively.
3. If nums[hi] - nums[lo] == k. Add into result. Then we need to check the duplicates for lo + 1, lo + 2. .... If no duplicates, hi++.
4. if nums[hi] - nums[lo] > k. lo++
5. If nums[hi] - nums[lo] < k, hi++.
Read full article from Buttercola: Zenefits: Two Minus
在一个整数数组中(有重复元素)找出有多少对,满足条件:他们的差等于k。例如[1,5,5,2,4,6,7],k=3,满足条件的对子有[1,4], [2,5], [2,5](注意有两个5),[4,7],所以程序返回4。这题比较tricky的地方在于k=0的情况需要另外考虑一下。
Solution:
1. Sort the array
2. Maintain two pointers, lo and hi, points to index 0 and 1, respectively.
3. If nums[hi] - nums[lo] == k. Add into result. Then we need to check the duplicates for lo + 1, lo + 2. .... If no duplicates, hi++.
4. if nums[hi] - nums[lo] > k. lo++
5. If nums[hi] - nums[lo] < k, hi++.
public
List<List<Integer>> findTwoMinus(
int
[] nums,
int
k) {
List<List<Integer>> result =
new
ArrayList<>();
if
(nums ==
null
|| nums.length <
2
) {
return
result;
}
Arrays.sort(nums);
int
lo =
0
;
int
hi =
1
;
int
n = nums.length;
while
(lo < n && hi < n) {
if
(nums[hi] - nums[lo] == k) {
List<Integer> curr =
new
ArrayList<>();
curr.add(nums[lo]);
curr.add(nums[hi]);
result.add(curr);
while
(lo +
1
< n && nums[lo] == nums[lo +
1
]) {
result.add(curr);
lo++;
}
hi++;
}
else
if
(nums[hi] - nums[lo] < k) {
hi++;
}
else
{
lo++;
}
}
return
result;
}