zoukankan      html  css  js  c++  java
  • 5418.二叉树中的伪回文路径

    image-20200524155918673

    提示

    • 给定二叉树的节点数目在 110^5 之间。
    • 节点值在 19 之间。

    思路

    • 首先通过List集合记录 二叉树中从根节点到各个叶子节点的所有路径
    • 判断每条路径是否为 伪回文路径
      • 若路径长度为奇数,则该路径中 相同值的节点数目除只有一个为奇数之外,其余数目都是偶数
      • 若路径长度为偶数,则该路径中 相同值的节点数目皆为偶数

    代码

    /*
     * 52ms 
     */
    public int pseudoPalindromicPaths(TreeNode root) {
            List<String> paths=new ArrayList<>();
            int ans=0;
            getPath(root,paths,root.val+"");
    
            for(String path:paths){
                if(check(path)){
                    ans++;
                }
            }
            return ans;
        }
    
        public boolean check(String path){
            int[] counts=new int[10];
            boolean flag=true;
            int len=path.length();
            for(char c:path.toCharArray()){
                counts[c-'0']+=1;
            }
            //长度为偶数
            if(len%2==0){
                for(int i=1;i<=9;i++){
                    if(counts[i]%2!=0){
                        flag=false;
                        break;
                    }
                }
            }else{
                int oddCount=0;
                for(int i=1;i<=9;i++){
                    if(oddCount>1){
                        flag=false;
                        break;
                    }
                    if(counts[i]%2==1){
                        oddCount++;
                    }
                }
            }
            return flag;
        }
    
        public void getPath(TreeNode node,List<String> paths,String s) {
           if(node.left==null&&node.right==null){
               paths.add(s);
               return;
           }
           if(node.left!=null){
               getPath(node.left, paths, s+node.left.val);
           }
           if(node.right!=null){
               getPath(node.right, paths, s+node.right.val);
           }
        }
    

    使用位运算优化判断伪回文路径过程

    思路

    image-20200524163618464

    代码

       /**
         * 优化
         * 通过位运算 判定是否为 伪回文路径
         * 2ms
         */
        private int count;
        public int pseudoPalindromicPaths2(TreeNode root){
            count=0;
            if(root==null) return count;
            dfs(root,0);
            return count;
        }
    
        private void dfs(TreeNode node, int v) {
            v^=(1<<node.val);//node节点的val为几就左移几位
            if(node.left==null&&node.right==null){
                if(v==0||(v&(v-1))==0){//判断是否为回文
                    count++;
                }
                return;
            }
            if(node.left!=null){
                dfs(node.left, v);
            }
            if(node.right!=null){
                dfs(node.right, v);
            }
        }
    

    参考原文:

    wxxxxxxx:位运算解法2ms

  • 相关阅读:
    部署第二个master节点
    Spark On YARN使用时上传jar包过多导致磁盘空间不够。。。
    Spark1.3使用外部数据源时条件过滤只要是字符串类型的值均报错
    spark1.3编译过程中遇到的一个坑
    Hive On Spark hiveserver2方式使用
    Hive On Spark概述
    Hive On Spark环境搭建
    RDD常用方法之subtract&intersection&cartesian
    SparkSQL DataFrames操作
    通过Spark SQL关联查询两个HDFS上的文件操作
  • 原文地址:https://www.cnblogs.com/yh-simon/p/12951468.html
Copyright © 2011-2022 走看看