LeetCode17: 4Sum

Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a â‰¤ b â‰¤ c â‰¤ d)
  • The solution set must not contain duplicate quadruplets.

    For example, given array S = {1 0 -1 0 -2 2}, and target = 0.

    A solution set is:
    (-1,  0, 0, 1)
    (-2, -1, 1, 2)
    (-2,  0, 0, 2)

import java.util.Iterator;
public class Solution {
    class TwoSum{
        public int index1;
        public int index2;
        public int sum;
        
        TwoSum(int index1, int index2, int sum){
            this.index1=index1;
            this.index2=index2;
            this.sum=sum;
        }
    }
    
    boolean contain(ArrayList<ArrayList<Integer>> listOfList, ArrayList<Integer> list){
        for(int i=0; i<listOfList.size(); i++){
            if(listOfList.get(i).get(0).equals(list.get(0))
                && listOfList.get(i).get(1).equals(list.get(1))
                && listOfList.get(i).get(2).equals(list.get(2)) )
                return true;
        }
        return false;
    }
    
    public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
        // Start typing your Java solution below
        // DO NOT write main() function
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if(num.length < 4)  return res;
        
        HashMap<Integer, List<TwoSum>> tsMap = new HashMap<Integer, List<TwoSum>>();
        // get all two sum pairs.
        for(int i=0; i<num.length-1; i++){
            for(int j=i+1; j<num.length; j++){
                int sum = num[i]+num[j];
                TwoSum ts = new TwoSum(i,j, sum);
                List<TwoSum> tsList = tsMap.get(sum);
                if(tsList == null){
                    tsList = new ArrayList<TwoSum>();
                    tsMap.put(sum, tsList);
                }
                tsList.add(ts);
            }
        }
        
        Iterator it = tsMap.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry pairs = (Map.Entry) it.next();
            int a = (Integer) pairs.getKey();
            List<TwoSum> tsList = (List<TwoSum>)pairs.getValue();
            
            List<TwoSum> tsList1 = (List<TwoSum>) tsMap.get(target-a);
            if(tsList1 != null){
                for(TwoSum ts:tsList){
                    for(TwoSum ts1:tsList1){
                        // Avoid reuse of any elements in num[]
                        if(ts.index1 == ts1.index1) continue;
                        if(ts.index1 == ts1.index2) continue;
                        if(ts.index2 == ts1.index1) continue;
                        if(ts.index2 == ts1.index2) continue;
                        ArrayList<Integer> resItem = new ArrayList<Integer>();
                        resItem.add(num[ts.index1]);
                        resItem.add(num[ts.index2]);
                        resItem.add(num[ts1.index1]);
                        resItem.add(num[ts1.index2]);
                        
                        Collections.sort(resItem);
                        // Add resItem into res and ignore duplicated ones
                        if(!contain(res, resItem))
                            res.add(resItem);
                    }
                }
            }
            else
                continue;
        }
        return res;
    }
}

#use hashset to filtering duplicated solution set#

import java.util.Iterator;
public class Solution {
    class TwoSum{
        public int index1;
        public int index2;
        public int sum;
        
        TwoSum(int index1, int index2, int sum){
            this.index1=index1;
            this.index2=index2;
            this.sum=sum;
        }
    }
    
    public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
        // Start typing your Java solution below
        // DO NOT write main() function
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if(num.length < 4)  return res;
        
        HashMap<Integer, List<TwoSum>> tsMap = new HashMap<Integer, List<TwoSum>>();
        // get all two sum pairs.
        for(int i=0; i<num.length-1; i++){
            for(int j=i+1; j<num.length; j++){
                int sum = num[i]+num[j];
                TwoSum ts = new TwoSum(i,j, sum);
                List<TwoSum> tsList = tsMap.get(sum);
                if(tsList == null){
                    tsList = new ArrayList<TwoSum>();
                    tsMap.put(sum, tsList);
                }
                tsList.add(ts);
            }
        }
        
        HashSet<ArrayList<Integer>> hs = new HashSet<ArrayList<Integer>>();
        Iterator it = tsMap.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry pairs = (Map.Entry) it.next();
            int a = (Integer) pairs.getKey();
            List<TwoSum> tsList = (List<TwoSum>)pairs.getValue();
            
            List<TwoSum> tsList1 = (List<TwoSum>) tsMap.get(target-a);
            if(tsList1 != null){
                for(TwoSum ts:tsList){
                    for(TwoSum ts1:tsList1){
                        // Avoid reuse of any elements in num[]
                        if(ts.index1 == ts1.index1) continue;
                        if(ts.index1 == ts1.index2) continue;
                        if(ts.index2 == ts1.index1) continue;
                        if(ts.index2 == ts1.index2) continue;
                        ArrayList<Integer> resItem = new ArrayList<Integer>();
                        resItem.add(num[ts.index1]);
                        resItem.add(num[ts.index2]);
                        resItem.add(num[ts1.index1]);
                        resItem.add(num[ts1.index2]);
                        
                        Collections.sort(resItem);
                        // Add resItem into res and ignore duplicated ones
                        if(!hs.contains(resItem)){
                            hs.add(resItem);
                            res.add(resItem);
                        }
                    }
                }
            }
            else
                continue;
        }
        return res;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值