• 1457. Pseudo-Palindromic Paths in a Binary Tree


    今天继续刷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里面的,就这点多余的操作竟然会超时,我也是服了。

    只有0和1的世界是简单的
  • 相关阅读:
    mysql 开发进阶篇系列 18 MySQL Server(innodb_buffer_pool_size)
    sql server 备份与恢复系列三 简单恢复模式下的备份与还原
    (后端)SQL Server日期时间函数
    (网页)the server responded with a status of 403 (Forbidden)
    (其他)小程序介绍和开发
    (网页)jQuery UI 实例
    (其他)令人忧虑,不阅读的中国人
    (其他)程序员的8种好习惯
    (后端)NoSuchMethodError
    JsonParseException:非法的unquoted字符((CTRL-CHAR,代码9)):必须被转义
  • 原文地址:https://www.cnblogs.com/nullxjx/p/14238309.html
Copyright © 2020-2023  润新知