查看: 932| 回复: 0
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 113. Path Sum II

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 liuzz10 于 2020-9-11 22:43 编辑

(原本这个帖子是我录制的gas station数学证明的视频,但是我发帖后又后悔了><等准备好了再发出来吧~换了一个新的内容,幸好有库存😆)
It's similar with 257.Binary Tree Paths https://leetcode.com/problems/binary-tree-paths/description/ and 46. Permutations https://leetcode.com/problems/permutations/
The point is to "take photo" on qualified paths before it's changing. You want to record the correct `path`. I have two ways. They differs in when to "take the photo". Other than that it's all the same. 1 is easier to understand than 2, but with more expansive space cost.

**Solution 1**

When calling the recursive function, simply create new list to make it seperate with the other paths, otherwise the list will be overwritten when return back.
It's like you create parallel universes so that they don't bother each other. It's expensive in space complexity though.
```
class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        List<Integer> list = new ArrayList<>();
        List<List<Integer>> output = new ArrayList<>();
        helper(root, sum, list, output);
        return output;
    }

    public void helper(TreeNode node, int sum, List<Integer> list, List<List<Integer>> output) {
        if (node == null) return;
        list.add(node.val);
        if (sum == node.val && node.left == null && node.right == null) {
            output.add(list);
        } else {
            sum -= node.val;
            helper(node.left, sum, new ArrayList(list), output); // Take "photo" here
            helper(node.right, sum, new ArrayList(list), output); // Take "photo" here
        }
    }
}
```


**Solution 2. Backtracking**

We can "take photo" once we found a qualified path. In this way, we don't have to cost that much on space because of creating "parallel universes". However, in this way, there's bug since we are not able to recover `path` after recursion. Because after each recursion, we have already `list.add(node.val);` before returning to a last level above.

Therefore, when we arriving at the last level above, the length of the list has increased 1. Therefore, we need to delete it to "recover" like we never touch before.
```
class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        List<Integer> list = new ArrayList<>();
        List<List<Integer>> output = new ArrayList<>();
        helper(root, sum, list, output);
        return output;
    }

    private void helper(TreeNode node, int sum, List<Integer> list, List<List<Integer>> output) {
        if (node == null) return;
        list.add(node.val);
        if (sum == node.val && node.left == null && node.right == null) {
            output.add(new ArrayList(list)); // Take "photo" here
        } else {
            sum -= node.val;
            helper(node.left, sum, list, output);
            helper(node.right, sum, list, output);
        }
        list.remove(list.size() - 1); // Recover like you never touch it before
    }
}
```




上一篇:分享Leetcode的FLAG高频题
下一篇:建stack时,用Stack&lt;&gt;和Linkedlist&lt;&gt;的区别?
您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表