一.三数之和
分析:这道题将三数之和实际上转化为两数之和在处理,让两个数字的和加起来等于目标数减去第一个数所得的差值即可。为了给随机的数组创造一些规律性,一般来说要对数组先排序,这道题就是这样的。排完序之后,因为三个正数的和不能等于0,所以这是一个剪枝的条件,这样减少所需的时间。要去除重复的三元组,你不可以用if(i>0&&nums[i]==nums[i-1]) continue;
这个你经常可以在题解中看到的语句,否则在leetcode上提交时有的样例会答案不完整。老老实实的一步步来,先去掉完全重复的,再去掉只有值重复的就可以了。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res=new ArrayList<>();
if(nums.length<3) return res;
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(nums[i]>0) break;
//if(i>0&&nums[i]==nums[i-1]) continue;
int low=i+1,high=nums.length-1,sum=0-nums[i];
List<Integer> lis=new ArrayList<>();
while(low<high){
if(nums[low]+nums[high]==sum){
lis.add(nums[i]);
lis.add(nums[low]);
lis.add(nums[high]);
if(!res.contains(lis)) res.add(Arrays.asList(nums[i],nums[low],nums[high]));
while(low<high&&nums[low]==nums[low-1])low++;
while(low<high&&nums[high]==nums[high-1])high--;
low++;
high--;
}else if(nums[low]+nums[high]<sum)low++;
else high--;
}
}
for(int m=0;m<res.size();m++){
for(int n=res.size()-1;n>m;n--){
if(res.get(n).equals(res.get(m)))
res.remove(n);
}
}
return res;
}
}