Solution 1: 用hashmap空间复杂度O(n),两个循环时间复杂度O(n2)
这题用hashmap的思路是从leetcode1.two sum想到的。
Arrays.sort(nums);是什么神仙静态方法,又一次感叹java的封装性
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Map<Integer,Integer> hashmap = new HashMap<>();
Arrays.sort(nums);
List<List<Integer>> list=new ArrayList<List<Integer>>();
for(int i=0;i<nums.length;i++){
hashmap.put(nums[i],i);
}
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
int sum=(nums[i]+nums[j])*-1;
if(hashmap.containsKey(sum)&&hashmap.get(sum)>j){
List<Integer> list1=new ArrayList<>();
list1.add(nums[i]);
list1.add(nums[j]);
list1.add(sum);
list.add(list1);
}
while(j<nums.length-1&&nums[j]==nums[j+1]){
j++;
}
}
while(i<nums.length-1&&nums[i]==nums[i+1]){
i++;
}
}
return list;
}
}
Solution 2: two pointer
fix i,然后p和q分别左右移动
注意:去重的时候,i和p都要处理,因为两个数可以唯一确定一个答案。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> list=new ArrayList<List<Integer>>();
int p=0;
int q=nums.length-1;
for(int i=0;i<nums.length-2;i++){
if(i!=0&&nums[i]==nums[i-1])continue;
p=i+1;
q=nums.length-1;
while(p<q){
int sum=-(nums[p]+nums[q]);
List<Integer> list1=new ArrayList<Integer>();
if(sum>nums[i]){
p++;
}
else if(sum<nums[i]){
q--;
}
else{
list1.add(nums[i]);
list1.add(nums[p]);
list1.add(nums[q]);
list.add(list1);
p++;
while(p<nums.length&&nums[p]==nums[p-1]){
p++;
//p略过重复的,pq是一个新的组合,q就不用动了
continue;
}
//如果p没有重复的,那么pq一起动
q--;
}
}
}
return list;
}
}
其实匹配成功了也可以不动q,这样的逻辑更通顺。
因为i和p就能唯一确定一个答案了。
如下面这样处理:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> list=new ArrayList<List<Integer>>();
int p=0;
int q=nums.length-1;
for(int i=0;i<nums.length-2;i++){
if(i!=0&&nums[i]==nums[i-1])continue;
p=i+1;
q=nums.length-1;
while(p<q){
int sum=-(nums[p]+nums[q]);
List<Integer> list1=new ArrayList<Integer>();
if(sum>nums[i]){
p++;
}
else if(sum<nums[i]){
q--;
}
else{
list1.add(nums[i]);
list1.add(nums[p]);
list1.add(nums[q]);
list.add(list1);
p++;
while(p<nums.length&&nums[p]==nums[p-1]){
p++;
}
}
}
}
return list;
}
}