classSolution{List<List<Integer>> res;List<Integer> quadTmp;publicList<List<Integer>>fourSum(int[] nums,int target){// Result arraylist
res =newArrayList<>();// Temp quadruplets
quadTmp =newArrayList<>();Arrays.sort(nums);kSum(4,0,(long) target, nums);return res;}privatevoidkSum(int k,int start,long target,int[] nums){// Non 2sum problemif(k !=2){// At least left 3 numbersfor(int i = start; i < nums.length - k +1;++i){// Skip equals, cuz need unique quadrupletsif(i > start && nums[i]== nums[i -1])continue;// Add to the tmp
quadTmp.add(nums[i]);// Call to process 3 sum problem// i + 1 => start from next index// target - nums[i] => remaining numberkSum(k -1, i +1, target - nums[i], nums);
quadTmp.remove(quadTmp.size()-1);}// Completed processing 4 sum problemreturn;}// 2 sum problemint l = start, r = nums.length -1;while(l < r){if(nums[l]+ nums[r]> target){--r;}elseif(nums[l]+ nums[r]< target){++l;}else{// equal// Found a combination, adding to the resultArrayList<Integer> comb =newArrayList();
comb.addAll(quadTmp);
comb.add(nums[l]);
comb.add(nums[r]);
res.add(comb);// Move a pointer++l;// Skip duplicatewhile(l < r && nums[l]== nums[l -1]){++l;}}}}}