代码随想录-2023/07/21

87 阅读1分钟

回溯开篇

77.组合

注意: 组合要求有序, 不能重复---排列无序, 可以重复

回溯模板: 递归纵向遍历, for循环横向遍历, 在for循环对节点处理, 递归, 回溯

代码:

class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    LinkedList<Integer> list = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        backtracking(n, k, 1);
        return ans;
    }

    public void backtracking(int n, int k, int start) {
        // 递归出口
        if(list.size() == k) {
            ans.add(new ArrayList<>(list));
            return;
        }

        for(int i=start; i <= n; i++){
            list.add(i);
            backtracking(n, k, i+1);
            list.removeLast();
        }
    }
}

总结

  1. 注意回溯本质是穷举法, 所以时间复杂度一般很高
  2. 如果数据范围太大, 则不适合用回溯, 一般用动态规划

区别: 回溯是从顶向下, 动态规划是从底向上