看了一下别人写的,太复杂了。。
这道题难点在于去重,我也没有什么好办法,所以使用HashSet,记录每个list.tostring的值,进行去重
以下代码好于89%以上的答案

ArrayList<ArrayList<Integer>> result = new ArrayList<>();
HashSet<String> set = new HashSet<>();

public ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int target) {
    Arrays.sort(num);
    cal(num, target, 0, new ArrayList<>());
    return result;
}

private void cal(int[] num, int target, int current, ArrayList<Integer> list) {
    if (current < num.length && num[current] > target) return;
    for (int i = current; i < num.length; i++) {
        if (num[i] == target) {
            list.add(num[i]);
            if (!set.contains(list.toString())) {
                result.add(new ArrayList<>(list));
                set.add(list.toString());
            }
            return;
        } else if (num[i] < target) {
            list.add(num[i]);
            cal(num, target - num[i], i + 1, new ArrayList<>(list));
            list.remove(list.size() - 1);
        } else {
            break;
        }
    }
}