
这里要学一下回溯算法
如果解决一个问题有多个步骤,每一个步骤有多种方法,题目又要我们找出所有的方法,可以使用回溯算法
然后回到问题,组合问题(组合不考虑顺序,相似的那叫排列,考虑顺序),那举个🌰,直接用别人的图
注意这个剪枝
理解下算法
public class Solution {public List<List<Integer>> combine(int n, int k) {List<List<Integer>> res = new ArrayList<>();if (k <= 0 || n < k) {return res;}// 从 1 开始是题目的设定Deque<Integer> path = new ArrayDeque<>();//双端队列dfs(n, k, 1, path, res);return res;}private void dfs(int n, int k, int begin, Deque<Integer> path, List<List<Integer>> res) {// 递归终止条件是:path 的长度等于 kif (path.size() == k) {res.add(new ArrayList<>(path));return;}// 遍历可能的搜索起点for (int i = begin; i <= n; i++) {// 向路径变量里添加一个数path.addLast(i);// 下一轮搜索,设置的搜索起点要加 1,因为组合数理不允许出现重复的元素dfs(n, k, i + 1, path, res);// 重点理解这里:深度优先遍历有回头的过程,因此递归之前做了什么,递归之后需要做相同操作的逆向操作path.removeLast();}}}
有点别的想法,但是还没实现,先放着
