nSum问题,递归模板

import java.util.*;
public class Solution {
    public ArrayList> fournumber (ArrayList nums, int target) {
        Collections.sort(nums);
        // System.out.println(nums);
        return nSumTarget(nums, 4, 0, target);
    }
    private ArrayList> nSumTarget(ArrayList nums,int n,int start,int target){
        int sz = nums.size();
        ArrayList> res = new ArrayList();
        if(n<2 || sz < n){
            return res;
        }
        if(n==2){
            int low = start,high = sz-1;
            while(low<high){
                int sum = nums.get(low)+nums.get(high);
                int left = nums.get(low),right = nums.get(high);
                if(sum<target){
                    while(low<high && nums.get(low) == left)
                        low++;
                }else if(sum > target){
                    while(low<high && nums.get(high) == right)
                        high--;
                }else{
                    res.add(new ArrayList(Arrays.asList(left,right)));
                    while(low<high && nums.get(low) == left)
                        low++;
                    while(low<high && nums.get(high) == right)
                        high--;
                }
            }
        }else{
            int i = start;
            while(i<sz){
                int now = nums.get(i);
                ArrayList> sub = nSumTarget(nums,n-1,i+1,target-nums.get(i));
                for(ArrayList s:sub){
                    s.add(now);
                    res.add(s);
                }
                while(i<sz && nums.get(i) == now)
                    i++;
            }
        }
        return res;
    }
}