添加链接描述
这道题花了一整天都有了,前前后后试了很多次,主要是卡在了去重的那些步骤,先后顺序没有分清,多层循环嵌套比较容易乱,最后只能参考答案了555~
指针越界:
好多错误,我直接破防了。
//错误代码,
import java.util.Arrays;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
if(nums.length < 3 || nums[0] > 0){
System.out.println("res: "+res);
return res;
}
int sum;
int left;
int right;
for(int index = 0; index < nums.length; index++){
//index要比index-1大
System.out.println("index: "+index);
if(index > 0 && nums[index] == nums[index-1]){
continue;
}
left = index + 1;
right = nums.length - 1;
while(left < right){
//判断是否需要录入
sum = nums[index] + nums[left] + nums[right];
if (sum > 0){
right--;
System.out.println("right: "+right);
}
else if(sum < 0){
left++;
System.out.println("left: "+left);
}
else if(sum == 0){
List<Integer> subList = new ArrayList<>();
subList.add(nums[index]);
subList.add(nums[left]);
subList.add(nums[right]);
System.out.println("subList: "+subList);
res.add(subList);
//left和right去重
while(left < nums.length-1 && nums[left] == nums[left + 1]){
left++;
System.out.println("left1: "+left);
}
while(right > 0 && nums[right] == nums[right - 1]){
right--;
System.out.println("right1: "+right);
}
//left和right指向下一个不同的数
left++;
right--;
}
}
}
return res;
}
}
是因为打印太多了。。。。
正确代码:
import java.util.Arrays;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//哈希表的C++实在看不懂。。。
//还是别勉强了
//用三指针吧
//这道题关键在于去重
//比如:-------
//特殊条件先考虑
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
if(nums.length < 3 || nums[0] > 0){
//System.out.println("res: "+res);
return res;
}
int sum;
int left;
int right;
for(int index = 0; index < nums.length; index++){
//index要比index-1大
//System.out.println("index: "+index);
if(index > 0 && nums[index] == nums[index-1]){
continue;
}
left = index + 1;
right = nums.length - 1;
while(left < right){
//判断是否需要录入
sum = nums[index] + nums[left] + nums[right];
if (sum > 0){
right--;
//System.out.println("right: "+right);
}
else if(sum < 0){
left++;
//System.out.println("left: "+left);
}
else if(sum == 0){
List<Integer> subList = new ArrayList<>();
subList.add(nums[index]);
subList.add(nums[left]);
subList.add(nums[right]);
//System.out.println("subList: "+subList);
res.add(subList);
//left和right去重
while(left < nums.length-1 && nums[left] == nums[left + 1]){
left++;
//System.out.println("left1: "+left);
}
while(right > 0 && nums[right] == nums[right - 1]){
right--;
//System.out.println("right1: "+right);
}
//left和right指向下一个不同的数
left++;
right--;
}
}
}
return res;
}
}