nth Sum
I. twoSum
Multiple Pairs
- Return all pairs of element that sum up to target
- e.g.
nums = [1, 3, 1, 2, 2, 3], target = 4
- Ans:
[[1, 3], [2, 2]]
[1, 3]
and[3, 1]
are the same pair
- Ans:
List<List<Integer>> twoSumTarget(int[] nums, int target) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
int lo = 0, hi = nums.length - 1;
while (lo < hi) {
int sum = nums[lo] + nums[hi];
// 根据 sum 和 target 的比较,移动左右指针
if (sum < target) {
lo++;
} else if (sum > target) {
hi--;
} else {
res.add(Arrays.asList(nums[lo], nums[hi]));
lo++;
hi--;
}
}
return res;
}
- The problem is that we will have duplicate pairs, e.g.
nums = [1, 1, 1, 2, 2, 3, 3]
. The[1, 3]
pairs are duplicated - The solution is to skip the duplicate numbers when we find the target
// ...
while (lo < hi) {
int sum = nums[lo] + nums[hi];
// 记录索引 lo 和 hi 最初对应的值
int left = nums[lo], right = nums[hi];
if (sum < target) {
lo++;
} else if (sum > target) {
hi--;
} else {
res.add(new ArrayList<>(Arrays.asList(left, right)));
// 跳过所有重复的元素
while (lo < hi && nums[lo] == left) lo++;
while (lo < hi && nums[hi] == right) hi--;
}
}
// ...