public ArrayList<ArrayList<Integer>> threeSumOverTimeLimit(int[] num) {
		ArrayList<ArrayList<Integer>> result = new ArrayList<>();
		Map<Integer, ArrayList<Pair<Integer, Integer>>> map = new HashMap<Integer, ArrayList<Pair<Integer,Integer>>>();
		if(num.length < 3) return result;
		//sort num fisrt:
		Arrays.sort(num);
		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)){
					ArrayList<Pair<Integer, Integer>> temp = new ArrayList<>();
					temp.add(new Pair<Integer, Integer>(i, j));
					map.put(key, temp);
				}else{
					map.get(key).add(new Pair<Integer, Integer>(i, j));
				}
			}
		}
		
		for(int i = 0; i < num.length; ++i){
			int key = 0 - num[i];
			if(!map.containsKey(key)) continue;
			ArrayList<Pair<Integer, Integer>> temp = map.get(key);
			for(int k = 0; k < temp.size(); ++k){
				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]);
				result.add(r);
			}
		}
//		PublicMethods.printArray(num);
		Set<ArrayList<Integer>> removeDup = new HashSet<>(result);
		result.clear();
		result.addAll(removeDup);
		return result;
	}