题目
思路
还是看别人写的吧!太难了 不是很明白!
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> out = new ArrayList<>();
// 先进行排序
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
// 排序后 第一个数就>0 则后面的都>0 无法凑成和为0的三元组
if(nums[i] > 0){
return out;
}
// 去掉重复值
if(i > 0 && nums[i] == nums[i-1]){
continue;
}
int left = i + 1;
int right = nums.length -1;
while (right > left){
int sum = nums[i] + nums[left] + nums[right];
if(sum > 0){
right --;
}else if(sum < 0){
left ++;
}else {
out.add(Arrays.asList(nums[i],nums[left],nums[right]));
while (right > left && nums[right] == nums[right - 1]) right --;
while (right > left && nums[left] == nums[left + 1]) left ++;
right --;
left ++;
}
}
}
return out;
}
}
题目
思路
自己的思路:前面三个数由三数之和确定,最后再遍历一遍nums来找到第4个数,但是三数之和返回的是三个具体的数,无法对第四个数与前面三个数是否重复进行判断。
看了题解,是在三数之和的外面再加了一层循环,也就是确定两个指针,遍历另两个指针。
代码
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> out = new ArrayList<>();
// 先进行排序
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
// 排序后 第一个数就>target
if (nums[i] > 0 && nums[i] > target) {
return out;
}
// 去掉重复值
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
// 第二个确定的指针
for (int j = i + 1; j < nums.length; j++) {
// 去重
if(j > i+1 && nums[j] == nums[j-1]){
continue;
}
// 其他逻辑与三数之和相同
int left = j + 1;
int right = nums.length - 1;
while (right > left) {
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum > target) {
right--;
} else if (sum < target) {
left++;
} else {
out.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
right--;
left++;
}
}
}
}
return out;
}
}