18. 四数之和

Java回溯版(超时)

package leetcode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class demo_18 {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list=new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        long sum=0;
        backtrack(list, new ArrayList<Integer>(), sum, target, nums, 0);
        System.out.println(list);
        return list;
    }
    public void backtrack(List<List<Integer>> list,List<Integer> alist,long sum,int target,int nums[],int j) {
        if(sum==target&&alist.size()==4) {
            list.add(new ArrayList<Integer>(alist));
        }
        else {
            for(int i=j;i<nums.length;i++) {
                if(i>j&&nums[i]==nums[i-1]) {continue;}
                j=i;
                if(alist.size()<4) {
                    sum=sum+nums[i];
                    alist.add(nums[i]);
                    backtrack(list, alist, sum, target, nums, j+1);
                    alist.remove(alist.size()-1);
                    sum=sum-nums[i];
                }
                else {
                    break;
                }
            }
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        demo_18 d18=new demo_18();
        int nums[]= {1,0,-1,0,-2,2,0,0,0};
        d18.fourSum(nums, 0);
    }

}

 CPP双指针

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
class Solution {
public:
    Solution(){}
    ~Solution(){}
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int len=nums.size();
        int left;
        int right;
        long sum=0;
        auto res=vector<vector<int>>();
        auto v=vector<int>();
        int i;
        int j;
        for (i = 0; i < len; i++)
        {
            //去除重复
            if(i>0&&nums[i]==nums[i-1]){continue;}
            for ( j = i+1; j < len; j++)
            {
                //去除重复
                if(j>i+1&&nums[j]==nums[j-1]){continue;}
                //左右指针
                left=j+1;
                right=len-1;
                while (left<right)
                {
                    sum=(long)nums[i]+nums[j]+nums[left]+nums[right];
                    if (target==sum)
                    {
                        v.push_back(nums[i]);
                        v.push_back(nums[j]);
                        v.push_back(nums[left]);
                        v.push_back(nums[right]);
                        res.push_back(v);
                    }
                    if (target>sum)
                    {
                        left=left+1;
                        //去除重复
                        while (left<right&&nums[left]==nums[left-1])
                        {
                            left=left+1;
                        }
                    }else{
                        right=right-1;
                        //去除重复
                        while (left<right&&nums[right]==nums[right+1])
                        {
                            right=right-1;
                        }
                    }
                    //更新vector
                    if (v.size()==4)
                    {
                        for (int m = 0; m < 4; m++)
                        {
                            v.pop_back();
                        }
                        left=left+1;
                    }
                }
            }     
        }
        return res;
    }
};

int main(){
    Solution s;
    auto res=vector<vector<int>>();
    auto nums=vector<int>{1,0,-1,0,-2,2};
    res=s.fourSum(nums,0);
    int len=res.size();
    for (int i = 0; i < len; i++)
    {
        auto v=res[i];
        for (int j = 0; j < 4; j++)
        {
            cout<<v[j]<<" ";
        }
        cout<<"\n";
    }
    return 0;
}

 

posted on 2022-11-28 20:33  一仟零一夜丶  阅读(18)  评论(0)    收藏  举报