- 刷完后经常遗忘,将每一题的思路记录下来,以便于复习
- 序号编号是牛客上的顺序:https://www.nowcoder.com/ta/coding-interviews
-
JZ17 树的的子结构
-
首先需要判断A,B的根节点是否一样。
- 如果不一样,判断A的左孩子和B的根节点是否一样,同理可判断A的右孩子和B的根节点是否一样。依次找下去
- 如果上述情况都不满足则说明不包含。
如果找到了A中有值(遍历A中的左右子树,利用递归,)是否有一个节点的值和B中的根节点相同,如果相等则比较左右子树是否相同。- 如果B为空了,则说明包含
如果A为空了而B不为空,则说明不包含
如果A中该比较路径的其中一个节点的值跟相对应的B的节点的值不对应,就是错的
- 如果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;
}
}