LeetCode 刷题【124. 二叉树中的最大路径和、125. 验证回文串】
124. 二叉树中的最大路径和
自己做
解:后序遍历
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {private int max = Integer.MIN_VALUE;public int postTravel(TreeNode root){if(root == null)return 0;int left = postTravel(root.left);int right = postTravel(root.right);//选其中一条路径if(left + root.val > max) //选左边max = left + root.val;if(right + root.val > max) //选右边max = right + root.val;if(root.val > max) //都不选max = root.val;//根连接两边路径if(left + root.val + right > max)max = left + root.val + right;//向上传递下面的最大路径和return Integer.max(Integer.max(left, right) + root.val, root.val);}public int maxPathSum(TreeNode root) {postTravel(root);return max;}
}
看题解
官方题解
原来只管往上传就好了
class Solution {int maxSum = Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {maxGain(root);return maxSum;}public int maxGain(TreeNode node) {if (node == null) {return 0;}// 递归计算左右子节点的最大贡献值// 只有在最大贡献值大于 0 时,才会选取对应子节点int leftGain = Math.max(maxGain(node.left), 0);int rightGain = Math.max(maxGain(node.right), 0);// 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值int priceNewpath = node.val + leftGain + rightGain;// 更新答案maxSum = Math.max(maxSum, priceNewpath);// 返回节点的最大贡献值return node.val + Math.max(leftGain, rightGain);}
}
125. 验证回文串
自己做
解:头尾双指针
class Solution {public boolean isPalindrome(String s) {int head = 0, tail = s.length() - 1;//跳过非字符、非数字while(head < tail && !(s.charAt(head) >= 'a' && s.charAt(head) <= 'z' ||s.charAt(head) >= 'A' && s.charAt(head) <= 'Z' ||s.charAt(head) >= '0' && s.charAt(head) <= '9'))head++;while(head < tail && !(s.charAt(tail) >= 'a' && s.charAt(tail) <= 'z' ||s.charAt(tail) >= 'A' && s.charAt(tail) <= 'Z' ||s.charAt(tail) >= '0' && s.charAt(tail) <= '9'))tail--;while(head < tail){//统一转为大写比较char left = s.charAt(head);char right = s.charAt(tail);if(left >= 'a')left -= 32;if(right >= 'a')right -= 32;if(left != right) //不匹配return false;head++;tail--;//跳过非字符、非数字while(head < tail && !(s.charAt(head) >= 'a' && s.charAt(head) <= 'z' ||s.charAt(head) >= 'A' && s.charAt(head) <= 'Z' ||s.charAt(head) >= '0' && s.charAt(head) <= '9'))head++;while(head < tail && !(s.charAt(tail) >= 'a' && s.charAt(tail) <= 'z' ||s.charAt(tail) >= 'A' && s.charAt(tail) <= 'Z' ||s.charAt(tail) >= '0' && s.charAt(tail) <= '9'))tail--;}return true;}
}