public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
int len = nums.length;
if(len < 4){ return result;}
Arrays.sort(nums);
if(nums[len-1]*4< target){return result;}
List<List<Integer>> listTmp = null;
for(int i = 0,iLoc = len-3 ; i< iLoc; i++){
if(nums[i]*4 > target ){break;}
int targetT = target - nums[i];
listTmp = threeSum(nums,i+1,len ,targetT );
for(List<Integer> tHV:listTmp){
List<Integer> tmp = new ArrayList<Integer>();
tmp.add(nums[i]);
tmp.add(tHV.get(0));
tmp.add(tHV.get(1));
tmp.add(tHV.get(2));
result.add(tmp);
}
while(i<iLoc-1 && nums[i]==nums[i+1]){
i++;
}
}
if(null!=listTmp){
listTmp.clear();
}
return result;
}
public List<List<Integer>> threeSum(int[] nums,int start,int len, int target ){
List<List<Integer>> list = new ArrayList<List<Integer>>();
List<List<Integer>> listTmp = null;
if(nums[len-1]*3< target){return list;}
for(int i = start,iLoc = len -2 ;i< iLoc;i++){
if(nums[i]*3 > target){break;}
int targetT = target - nums[i];
listTmp = twoSum(nums,i+1,len ,targetT );
for(List<Integer> tV:listTmp){
List<Integer> tmp = new ArrayList<Integer>();
tmp.add(nums[i]);
tmp.add(tV.get(0));
tmp.add(tV.get(1));
list.add(tmp);
}
while(i<iLoc-1 && nums[i]==nums[i+1]){
i++;
}
}
if(null!=listTmp){
listTmp.clear();
}
return list;
}
public List<List<Integer>> twoSum(int[] nums,int start,int len, int target ){
List<List<Integer>> list = new ArrayList<List<Integer>>();
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
if(target> nums[len-1]+nums[len-2]){
return list;
}
for(int i = start,iLoc = len ;i< iLoc;i++){
if(nums[i] > targetT){break;}*/
boolean move = false;
while(i<len-1 && nums[i]==nums[i+1]){
i++;
move = true;
}
if(map.containsKey(nums[i]) || target == nums[i]*2 && move){
List<Integer> tmp = new ArrayList<Integer>();
tmp.add(map.get(nums[i])==null ? nums[i]:map.get(nums[i]));
tmp.add(nums[i]);
list.add(tmp);
}
map.put(target - nums[i],nums[i]);
}
map.clear();
return list;
}
}