/* * 18. 4Sum * 2016-4-15 by Mingyang * 这个题目跟3sum一样的去重方法,不用HashSet,因为太慢,注意这个题目是4个的和为target,不为0 * 然后这里把判重条件改了一下,改为了 if(i>0&&nums[i]==nums[i-1]) continue; * 这么更言简意赅,同理,if(j>i+1&&nums[j]==nums[j-1])也是跳过 */
public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> res=new ArrayList<List<Integer>>(); int len=nums.length; if(nums==null||len==0) return res; Arrays.sort(nums); for(int i=0;i<len;i++){ if(i==0||nums[i]!=nums[i-1]){ for(int j=i+1;j<len;j++){ if(j==i+1||nums[j]!=nums[j-1]){ int low=j+1; int high=len-1; while(low<high){ int sum=nums[low]+nums[high]+nums[i]+nums[j]; if(sum==target){ List<Integer> list=new ArrayList<Integer>(); list.add(nums[i]); list.add(nums[j]); list.add(nums[low]); list.add(nums[high]); res.add(list); while(low<high&&nums[low]==nums[low+1]) low++; while(low<high&&nums[high]==nums[high-1]) high--; low++; high--; }else if(sum<target){ low++; }else{ high--; } } } } } } return res; }