算法通关村第十八关 | 青铜 | 回溯

1.回溯

回溯可以视为递归的拓展,有着明确的解题模板。

很大的不同之处是有一个撤销处理结果的操作,但是大框架就是遍历 N 叉树。

回溯主要解决暴力枚举都解决不了的问题。

回溯模板:

void backtracking(参数) {
  	if (终止条件) {
        存放结果;
        return;
    }
    for (选择本层集合中元素(画成树,就是树节点孩子的大小)) {
        处理节点;
        backtracking();
        回溯,撤销处理结果;
    }
}

回溯完整代码示例:返回 1 到 n 中所有可能的 k 个数的组合

public List<List<Integer>> combine(int n, int k) {
   
	List<List<Integer>> resultList = new ArrayList<>();
    if (k <= 0 || n < k) {
   
        return resultList;
    }

    Deque<Integer> path = new ArrayDeque<>();
    dfs(n, k, 1, path, res);
    return res;
}

public void dfs(int n, int k, int startIndex, Deque<Integer> path, List<List<Integer>> resultList) {
   
	if (path.size() == k) {
   
        resultList.add(new ArrayList<>(path));
        return;
    }
    for (int i = startIndex; i <= n; i++) {
   
        path.addLast(i);
        dfs(n, k, i + 1, path, resultList);
        path.removeLast();
    }
}

2.回溯题目:输出二叉树的所有路径

原题:力扣257.

class BinaryTreePaths {
   
    List<String> ans = new ArrayList<>();
    public List<String> binaryTreePaths(TreeNode root) {
   
        dfs(root, new ArrayList<>());
        return ans;
    }

    private void dfs(TreeNode root, List<Integer> temp) {
   
        if (root == null) {
   
            return;
        }
        temp.add(root.val);
        if (root.left == null && root.right == null) {
   
            ans.add(getPathString(temp));
        }
        dfs(root.left, temp);
        dfs(root.right, temp);
        temp.remove(temp.size() - 1);
    }

    private String getPathString(List<Integer> temp) {
   
        StringBuilder sb = new StringBuilder();
        sb.append(temp.get(0));
        for (int i = 1; i < temp.size(); i++) {
   
            sb.append("->").append(temp.get(i));
        }
        return sb.toString();
    }
}

3.回溯题目:路径总和问题

原题:力扣113.

class PathSum {
   
    List<List<Integer>> res = new ArrayList<>();
    
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
   
        LinkedList<Integer> path = new LinkedList<>();
        dfs(root, targetSum, path);
        return res;
    }

    public void dfs(TreeNode root, int targetSum, LinkedList<Integer> path) {
   
        if (root == null) {
   
            return;
        }
        targetSum -= root.val;
        path.add(root.val);
        if (targetSum == 0 && root.left == null && root.right == null) {
   
            res.add(new LinkedList(path));
        }
        dfs(root.left, targetSum, path);
        dfs(root.right, targetSum, path);
        path.removeLast();
    }
}

如果对您有帮助,请点赞关注支持我,谢谢! ❤
如有错误或者不足之处,敬请指正! ❤
个人主页:星不易
算法通关村专栏:不易|算法通关村

相关推荐

  1. 算法通关 | 青铜 | 回溯

    2023-12-12 18:58:02       63 阅读
  2. 算法通关 | 白银 | 回溯热门问题

    2023-12-12 18:58:02       69 阅读
  3. 算法通关 | 黄金 | 较难的回溯问题

    2023-12-12 18:58:02       60 阅读
  4. 算法通关—理解位运算的规则(青铜)

    2023-12-12 18:58:02       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-12 18:58:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-12 18:58:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-12 18:58:02       82 阅读
  4. Python语言-面向对象

    2023-12-12 18:58:02       91 阅读

热门阅读

  1. Linux【2】:清理几天前的文件夹YYYYMMDD

    2023-12-12 18:58:02       55 阅读
  2. 提升光伏电站发电量,可从这四个方面入手!

    2023-12-12 18:58:02       50 阅读
  3. 多线程和多进程

    2023-12-12 18:58:02       55 阅读
  4. Android 10.0 POWER键长按3S关机的实现

    2023-12-12 18:58:02       54 阅读
  5. PHP基础(3)

    2023-12-12 18:58:02       60 阅读
  6. 软件测试面试中的自动化问题

    2023-12-12 18:58:02       48 阅读
  7. Python中的lambda表达式

    2023-12-12 18:58:02       76 阅读