public ArrayList<ArrayList<Integer>> fourSum(int[] num, int sum) {
		ArrayList<ArrayList<Integer>> result = new ArrayList<>();
		if(num.length < 4){
			return result;
		}
		quickSort(num, 0, num.length - 1);
		Map<Integer, ArrayList<Pair<Integer, Integer>>> map = new HashMap<Integer, ArrayList<Pair<Integer,Integer>>>();
		for(int i = 0; i < num.length; ++i){
			for(int j = i + 1; j < num.length; ++j){
				int key = num[i] + num[j];
				if(map.containsKey(key))
					map.get(key).add(new Pair<Integer, Integer>(i, j));
				else{
					ArrayList<Pair<Integer, Integer>> temp = new ArrayList<>();
					temp.add(new Pair<Integer, Integer>(i, j));
					map.put(key, temp);
				}
			}
		}
		
		for(int i = 0; i < num.length; ++i){
			for(int j = i+1; j < num.length; ++j){
				int key = sum - num[i]- num[j];
				if(!map.containsKey(key)) continue;
				ArrayList<Pair<Integer, Integer>> temp = map.get(key);
				for(int k = 0; k < temp.size(); ++k){
//					System.out.println(temp.get(k).getElement1());
					if(i <= temp.get(k).getElement1()){
						continue;
					}
					ArrayList<Integer> r = new ArrayList<>();
					r.add(num[temp.get(k).getElement0()]);
					r.add(num[temp.get(k).getElement1()]);
					r.add(num[i]);
					r.add(num[j]);
					result.add(r);
				}
			}
		}
		//remove duplicate:
		Set<ArrayList<Integer>> removeDup = new HashSet<>(result);
		result.clear();
		result.addAll(removeDup);
		return result;
	}