📅  最后修改于: 2023-12-03 14:50:48.618000             🧑  作者: Mango
题目:在给定的整数数组中,找到所有唯一的三个数字的组合,使得它们的和等于给定的目标值。
函数签名:List<List<int>> threeSum(int[] nums, int target)
nums
: 一个整数数组,长度不超过 3000。数组中的整数可能重复。target
: 目标值,一个整数。返回一个二维整数数组,数组中的每个元素都是一个长度为 3 的数组,表示一个唯一的三个数字的组合,使得它们的和等于给定的目标值。返回的二维数组中,每个三元组都必须是唯一的,不能重复。
如果没有满足条件的三元组,则返回一个空数组。
nums = [-1, 0, 1, 2, -1, -4]
target = 0
[[-1, 0, 1], [-1, -1, 2]]
这个问题可以转化为在数组中找到所有不重复的三个数字的组合,使得它们的和等于给定的目标值。
首先对数组进行排序,然后遍历数组中的每一个数字,将其作为当前的目标,然后在其后的数字中使用双指针法进行查找。
具体步骤如下:
public List<List<int>> threeSum(int[] nums, int target) {
List<List<int>> result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++) {
if (i == 0 || nums[i] != nums[i - 1]) {
int left = i + 1;
int right = nums.length - 1;
int currentTarget = target - nums[i];
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == currentTarget) {
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
while (left < right && nums[left] == nums[left + 1])
left++;
while (left < right && nums[right] == nums[right - 1])
right--;
left++;
right--;
} else if (sum < currentTarget) {
left++;
} else {
right--;
}
}
}
}
return result;
}
该代码是使用 Java 编写的,在给定的整数数组中找到所有唯一的三个数字的组合,使得它们的和等于给定的目标值。它先对数组排序,然后通过双指针法在数组中查找满足条件的三个数字的组合。时间复杂度为 O(n^2)。