• 583,Offer12, Offer26


    #583,Offer12, Offer26

    538. 把二叉搜索树转换为累加树

    难度简单378收藏分享切换为英文关注反馈

    给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

    例如:

    输入: 原始二叉搜索树:
                  5
                /   
               2     13
    
    输出: 转换为累加树:
                 18
                /   
              20     13
    

    思路:将所有节点拆分排序,从大到小累加

    package LeetCode;
    
    import java.util.Comparator;
    import java.util.PriorityQueue;
    import java.util.Stack;
    
    /**
     * @ClassName Q538
     * @Description TODO
     * @Author m
     * @Version 1.0
     */
    public class Q538 {
        public TreeNode convertBST(TreeNode root) {
    
            if(root == null){
                return root;
            }
    
            PriorityQueue<TreeNode> p = new PriorityQueue<>(new Comparator<TreeNode>() {
                @Override
                public int compare(TreeNode o1, TreeNode o2) {
                    return o1.val < o2.val ? 1 : -1 ;
                }
            });
    
            Stack<TreeNode> s = new Stack<> ();
    
            s.add(root);
    
            while (!s.isEmpty()) {
                TreeNode now = s.pop();
                if(now.left != null){
                    s.add(now.left);
                }
                if(now.right != null) {
                    s.add(now.right);
                }
                p.offer(now);
            }
    
            int sum = 0;
    
            while (!p.isEmpty()) {
                TreeNode now = p.poll();
                now.val += sum;
                sum = now.val;
            }
    
            return root;
        }
    
    }
    
    

    剑指 Offer 12. 矩阵中的路径

    难度中等169收藏分享切换为英文关注反馈

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

    [[“a”,“b”,“c”,“e”],
    [“s”,“f”,“c”,“s”],
    [“a”,“d”,“e”,“e”]]

    但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

    示例 1:

    输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
    输出:true
    

    示例 2:

    输入:board = [["a","b"],["c","d"]], word = "abcd"
    输出:false
    

    提示:

    • 1 <= board.length <= 200
    • 1 <= board[i].length <= 200

    思路 : 经典的搜索问题,注意边界判断和走过的路径标记

    package LeetCode;
    
    /**
     * @ClassName Offer12
     * @Description TODO
     * @Author m
     * @Version 1.0
     */
    public class Offer12 {
    
        String word;
        char[][] board;
        boolean[][] vis;
        int[][] dir = new int[][] {
                {0,1}, {0,-1}, {1,0}, {-1,0}
        };
    
        public boolean exist(char[][] board, String word) {
            this.word = word;
            this.board = board;
    
            vis = new boolean[board.length][board[0].length];
    
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[i].length; j++) {
                    if(board[i][j] == word.charAt(0)) {
                        vis[i][j] = true;
                        if(dfs(0, i, j)){
                            return true;
                        }
                        vis[i][j] = false;
    
                    }
                }
            }
    
            return false;
        }
    
        private boolean check(int i , int j) {
            return i < board.length && i >= 0 && j < board[i].length && j >= 0;
        }
    
        private boolean dfs(int index, int i , int j) {
            char now = board[i][j];
            boolean res = false;
    
            if(now == word.charAt(index)) {
                index++;
                if(index == word.length()) {
                    return true;
                }
    
                for (int k = 0; k < 4; k++) {
                    int ii = i+dir[k][0];
                    int jj = j+dir[k][1];
                    if(check(ii, jj) && !vis[ii][jj]) {
                        vis[ii][jj] = true;
                        res |= dfs(index, ii, jj);
                        vis[ii][jj] = false;
                    }
    
                    if(res) {
                        break;
                    }
                }
    
            }
    
            return res;
        }
    }
    
    

    剑指 Offer 26. 树的子结构

    难度中等118收藏分享切换为英文关注反馈

    输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

    B是A的子结构, 即 A中有出现和B相同的结构和节点值。

    例如:
    给定的树 A:

    3 / 4 5 / 1 2
    给定的树 B:

    4 / 1
    返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

    示例 1:

    输入:A = [1,2,3], B = [3,1]
    输出:false
    

    示例 2:

    输入:A = [3,4,5,1,2], B = [4,1]
    输出:true
    

    限制:

    0 <= 节点个数 <= 10000
    

    思路:对A的每一个节点为起点和B比较

    package LeetCode;
    
    /**
     * @ClassName Offer26
     * @Description TODO
     * @Author m
     * @Version 1.0
     */
    public class Offer26 {
        public boolean isSubStructure(TreeNode A, TreeNode B) {
    
            return (A!= null && B != null) && (check(A, B) | isSubStructure(A.left, B) | isSubStructure(A.right, B));
    
        }
        private boolean check(TreeNode A , TreeNode B) {
            if(null == B) return true;
            if(A == null || A.val != B.val) return false;
            return check(A.left , B.left)&check(A.right, B.right);
        }
    }
    
    
    因为我喜欢追寻过程中的自己
  • 相关阅读:
    创意工坊pkg食用
    wordpress添加备案号出现乱码
    「Azure」数据分析师有理由爱Azure之四-Azure SQL的实操
    「Azure」数据分析师有理由爱Azure之三-对照Sqlserver学Azure
    「Azure」数据分析师有理由爱Azure之二-立即申请帐号开始学习之旅
    「Azure」数据分析师有理由爱Azure之一-Azure能带给我们什么?
    「Sqlserver」数据分析师有理由爱Sqlserver之十-Sqlserver自动化篇
    「Sqlserver」数据分析师有理由爱Sqlserver之九-无利益关系推荐Sqlserver书单
    「Sqlserver」数据分析师有理由爱Sqlserver之八-最刚需的数据导入导出功能-导出篇
    「Sqlserver」数据分析师有理由爱Sqlserver之七-最刚需的数据导入导出功能-导入篇
  • 原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359741.html
Copyright © 2020-2023  润新知