zoukankan      html  css  js  c++  java
  • 【Leetcode】【Medium】Path Sum II

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.

    For example:
    Given the below binary tree and sum = 22,

                  5
                 / 
                4   8
               /   / 
              11  13  4
             /      / 
            7    2  5   1
    

    return

    [
       [5,4,11,2],
       [5,8,4,5]
    ]

    解题:

    实用递归的方法,题目很简单,每深一层递归,带入新计算出的需要求的sum值,递归函数需要四个入参:最终返回数组,当前已经经历的路径,当前需要的sum,已经结点指针

    由于需要递归多个函数,刚开始为了防止“当前已经经历的路径”出现重复记载,因而没有形参没有使用指针,而完整的传入了整个数组,时间72ms

    代码如下:

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<vector<int> > pathSum(TreeNode *root, int sum) {
    13         vector<vector<int> > ret;
    14         vector<int> cur_nums;
    15         pathSumTree(ret, cur_nums, root, sum);
    16         return ret;
    17     }
    18     
    19     void pathSumTree(vector<vector<int> > &ret, vector<int> cur_nums, TreeNode *root, int cur_sum) {
    20         if (!root) 
    21             return;
    22         
    23         cur_nums.push_back(root->val);
    24         if (!root->left && !root->right && cur_sum - root->val == 0)
    25             ret.push_back(cur_nums);
    26         
    27         pathSumTree(ret, cur_nums, root->left, cur_sum - root->val);
    28         pathSumTree(ret, cur_nums, root->right, cur_sum - root->val);
    29         return;
    30     }
    31 };

    但是将形参设置为指针后,代码运行时间大大减少了,因为传递指针比传递整个数组高效多了;

    为了防止出现混乱,可以在每次路径考察结束后,将当前的结点从数组中pop出来,避免重复;

    代码如下,这次只需要不到20ms:

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<vector<int> > pathSum(TreeNode *root, int sum) {
    13         vector<vector<int> > ret;
    14         vector<int> cur_nums(0);
    15         pathSumTree(ret, cur_nums, root, sum);
    16         return ret;
    17     }
    18     
    19     void pathSumTree(vector<vector<int> > &ret, vector<int> &cur_nums, TreeNode *root, int cur_sum) {
    20         if (!root) 
    21             return;
    22         
    23         cur_nums.push_back(root->val);
    24         if (!root->left && !root->right && cur_sum - root->val == 0) {
    25             ret.push_back(cur_nums);
    26             cur_nums.pop_back();
    27             return;
    28         }
    29         
    30         pathSumTree(ret, cur_nums, root->left, cur_sum - root->val);
    31         pathSumTree(ret, cur_nums, root->right, cur_sum - root->val);
    32         cur_nums.pop_back();
    33         return;
    34     }
    35 };
  • 相关阅读:
    潜移默化学会WPF绘图 学习(一)
    MovablePlane issue
    ogre Fix bug in HLSL with 3×4 matrix arrays
    如何加强角色渲染的真实感(self shadow + subsurface scattering + rim lighting)
    The DirectX SDK (February 2010) release is now live on Microsoft downloads.
    Color Spaces
    游戏主循环
    实时动态云 perlin noise + 光照 + 太阳光遮挡
    这几个礼拜做的事情
    ogre无法读取中文路径的解决办法
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4276183.html
Copyright © 2011-2022 走看看