1457. Pseudo-Palindromic Paths in a Binary Tree

标签:private   操作   com   nullptr   str   efi   ++   nod   roo   

今天继续刷leetcode。

今天着重练习了一下回文串(Palindromic string)相关的题目,其中做到1457. Pseudo-Palindromic Paths in a Binary Tree这一道题的时候,自己方法没错,但跑了两次都是TLE,然后心态有点崩,就去看了一下别人的代码,发现我和别人思路基本一样,怎么我的就不行。

我一开始的解法如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int pseudoPalindromicPaths(TreeNode* root) {
        vector<int> out;
        int res = 0;
        searchBT(root, out, res);
        
        return res;
    }

    void searchBT(TreeNode* root, vector<int>& out, int& res) {
        if (root) {
            out.push_back(root->val);

            if (root->left == nullptr && root->right == nullptr) {
                vector<int> cnt(10, 0);
                for(auto e : out) cnt[e]++;
                int odd = 0;
                for(auto e : cnt){
                    if(e%2 != 0){
                        odd++;
                        if(odd > 1) break;
                    }
                }
                if(odd <= 1) res++;
            }
            else {
                searchBT(root->left, out, res);
                searchBT(root->right, out, res);
            }

            out.pop_back();
        }
    }
};

思路也没啥好讲的,就是用dfs寻找所有的路径,然后判断每一条路径是否符合条件。
这个代码在一个非常长的测试用例上超时了。

后面我在评论区看了一下别人的代码,把它改成下面这样就能通过了。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int pseudoPalindromicPaths(TreeNode* root) {
        searchBT(root);
        return res;
    }

    void searchBT(TreeNode* root) {
        if (root) {
            cnt[root->val]++;

            if (root->left == nullptr && root->right == nullptr) {
                int odd = 0;
                for(auto e : cnt){
                    if(e.second % 2 != 0){
                        odd++;
                        if(odd > 1) break;
                    }
                }
                if(odd <= 1) res++;
            }
            else {
                searchBT(root->left);
                searchBT(root->right);
            }

            cnt[root->val]--;
        }
    }
private:
    int res = 0;
    map<int, int> cnt;
};

看起来基本一样,我原来的是dfs到叶子的时候再去判断路径是不是合理,所以我中途把这条路径存在一个vector里面了,后面是直接存在一个map里面的,就这点多余的操作竟然会超时,我也是服了。

1457. Pseudo-Palindromic Paths in a Binary Tree

标签:private   操作   com   nullptr   str   efi   ++   nod   roo   

原文地址:https://www.cnblogs.com/njuxjx/p/14238309.html

版权声明:完美者 发表于 2021-01-07 12:43:48。
转载请注明:1457. Pseudo-Palindromic Paths in a Binary Tree | 完美导航

暂无评论

暂无评论...