剑指offer-Java-思路

    科技2022-07-14  115

    刷完后经常遗忘,将每一题的思路记录下来,以便于复习
    序号编号是牛客上的顺序:https://www.nowcoder.com/ta/coding-interviews



    JZ17 树的的子结构

    首先需要判断A,B的根节点是否一样。

    如果不一样,判断A的左孩子和B的根节点是否一样,同理可判断A的右孩子和B的根节点是否一样。依次找下去如果上述情况都不满足则说明不包含。 如果找到了A中有值(遍历A中的左右子树,利用递归,)是否有一个节点的值和B中的根节点相同,如果相等则比较左右子树是否相同。 如果B为空了,则说明包含 如果A为空了而B不为空,则说明不包含 如果A中该比较路径的其中一个节点的值跟相对应的B的节点的值不对应,就是错的

    代码:

    ```java public class Solution { //遍历大树 public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1 == null || root2 == null){ return false; } //如果找到与子树相同根的值,走判断方法 if(root1.val == root2.val){ if(judge(root1,root2)){ return true; } } //遍历左孩子,右孩子 return HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2); } //判断是否是子结构 public boolean judge(TreeNode root, TreeNode subtree) { //子结构已经循环完毕,代表全部匹配 if(subtree == null){ return true; } //大树已经循环完毕,并未成功匹配 if(root == null){ return false; } //相等后判断左右孩子 if(root.val == subtree.val){ return judge(root.left, subtree.left) && judge(root.right, subtree.right); } return false; } }


    JZ30最长子序列和

    dp[n]代表以当前元素为截止点的连续子序列的最大和,如果dp[n-1]>0,dp[n]=dp[n]+dp[n-1],因为当前数字加上一个正数一定会变大;如果dp[n-1]<0,dp[n]不变,因为当前数字加上一个负数一定会变小。使用一个变量max记录最大的dp值返回即可。 public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int max = array[0]; for(int i=1;i<array.length;i++){ array[i]+=array[i-1]>0?array[i-1]:0; max=Math.max(max,array[i]); } return max; } }
    Processed: 0.061, SQL: 8