这一题和那个3sum是一个思路。其实多少sum都是一样的。
有两种方法解,明显第二种比较快。
Solution 1: hashmap+三个循环
空间复杂度为O(n)
时间复杂度为O(n3)
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
Map<Integer,Integer> hashmap=new HashMap<Integer,Integer>();
Arrays.sort(nums);
List<List<Integer>> res=new ArrayList<>();
for(int i=0;i<nums.length;i++){
hashmap.put(nums[i],i);
}
for(int i=0;i<nums.length-3;i++){
for(int j=i+1;j<nums.length-2;j++){
for(int k=j+1;k<nums.length-1;k++){
int temp=target-nums[i]-nums[j]-nums[k];
if(hashmap.containsKey(temp)&&hashmap.get(temp)>k){
List<Integer> list=new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
list.add(temp);
res.add(list);
}
while(k+1<nums.length&&nums[k]==nums[k+1]){
k++;
}
}
while(j+1<nums.length&&nums[j]==nums[j+1]){
j++;
}
}
while(i+1<nums.length&&nums[i]==nums[i+1]){
i++;
}
}
return res;
}
}
Solution 2:fix两个数,然后用两个指针pq
时间复杂度O(n2)
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
List<List<Integer>> res=new ArrayList<>();
for(int i=0;i<nums.length-3;i++){
if(i!=0&&nums[i]==nums[i-1]){
continue;
}
for(int j=i+1;j<nums.length-2;j++){
if(j-1!=i&&nums[j]==nums[j-1]){
continue;
}
int p=j+1;
int q=nums.length-1;
while(p<q){
int sum=nums[i]+nums[j]+nums[p]+nums[q];
if(sum<target){
p++;
}
else if(sum>target){
q--;
}
else{
List<Integer> list=new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[p]);
list.add(nums[q]);
res.add(list);
p++;
while(p<nums.length&&nums[p-1]==nums[p]){
p++;
}
}
}
}
}
return res;
}
}