diff --git a/problems/0216.组合总和III.md b/problems/0216.组合总和III.md index 351b98c9..21230e0f 100644 --- a/problems/0216.组合总和III.md +++ b/problems/0216.组合总和III.md @@ -229,24 +229,33 @@ public: Java: ```java class Solution { - private List path = new ArrayList<>(); - private List> res = new ArrayList<>(); + List> res = new ArrayList<>(); + List list = new ArrayList<>(); + public List> combinationSum3(int k, int n) { - backtracking(k, n, 1); + res.clear(); + list.clear(); + backtracking(k, n, 9); return res; } - private void backtracking (int k, int count, int start) { - if (count == 0 && k == 0) { - res.add(new ArrayList<>(path)); + private void backtracking(int k, int n, int maxNum) { + if (k == 0 && n == 0) { + res.add(new ArrayList<>(list)); return; } - for (int i = start; i <= 9; i++) { - path.add(i); - backtracking(k - 1, count - i, i + 1); - path.remove(path.size() - 1); + // 因为不能重复,并且单个数字最大值是maxNum,所以sum最大值为 + // (maxNum + (maxNum - 1) + ... + (maxNum - k + 1)) == k * maxNum - k*(k - 1) / 2 + if (maxNum == 0 + || n > k * maxNum - k * (k - 1) / 2 + || n < (1 + k) * k / 2) { + return; } + list.add(maxNum); + backtracking(k - 1, n - maxNum, maxNum - 1); + list.remove(list.size() - 1); + backtracking(k, n, maxNum - 1); } }