《LeetCode力扣练习》代码随想录——回溯算法(组合—Java)
刷题思路来源于 代码随想录
77. 组合
-
回溯
class Solution { private List<Integer> path = new ArrayList<>(); private List<List<Integer>> result = new ArrayList<>(); public List<List<Integer>> combine(int n, int k) { backtrack(n, k, 1); return result; } private void backtrack(int n, int k, int index) { if (path.size() == k) { result.add(new ArrayList<>(path)); return; } for (int i = index; i < n + 1; i++) { path.add(i); backtrack(n, k, i + 1); path.remove(path.size() - 1); } return; } }
-
优化剪枝
class Solution { private List<Integer> path = new ArrayList<>(); private List<List<Integer>> result = new ArrayList<>(); public List<List<Integer>> combine(int n, int k) { backtrack(n, k, 1); return result; } private void backtrack(int n, int k, int index) { if (path.size() == k) { result.add(new ArrayList<>(path)); return; } for (int i = index; i < n + 1 - (k - path.size()) + 1; i++) { path.add(i); backtrack(n, k, i + 1); path.remove(path.size() - 1); } return; } }