/*** 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;* }* }*/classSolution{// 在递归过程中,维护一个需要返回的 max 值int max =Integer.MIN_VALUE;publicintmaxPathSum(TreeNode root){forMax(root);return max;}intforMax(TreeNode root){if(root ==null){returnInteger.MIN_VALUE;}// 先往左右子结点走int left =forMax(root.left);int right =forMax(root.right);// ans:用于维护 max,可能已经不能往上走了(已经走了左右子树)int ans = root.val;// 不一定取,因为可能是负数ans += left >0? left :0;ans += right >0? right :0;max =Math.max(ans, max);// forPa:用于给上层结点,一定不是同时走了左右子树的路径int forPa = root.val;// 最多只能走一边:走左 or 右 or 不走int add = left > right ? left : right;if(add >0){forPa += add;}// 返回往上走的可行路径最大值return forPa;}}
更新版
照例感叹之前写的代码怎么这么冗余。。
classSolution{int max =Integer.MIN_VALUE;publicintmaxPathSum(TreeNode root){maxPath(root);return max;}publicintmaxPath(TreeNode root){if(root ==null){return0;}int left =Math.max(0,maxPath(root.left));int right =Math.max(0,maxPath(root.right));max =Math.max(root.val + left + right, max);returnMath.max(left + root.val, right + root.val);}}
文章目录题目描述思路 & 代码题目描述
挺简单的,直接看思路代码吧。
思路 & 代码
就是一个层序遍历,取每层的最右边结点即可
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…
文章目录题目描述思路 & 代码更新版题目描述
本质:找满足 k * k < x 的最大 k
思路 & 代码
二分,对满足 k * k < x 的最大 k进行查找。注意极端数据,用 long暴力法先来一个
class Solution {public int mySqrt(int x) {in…
文章目录路径总和 I路径总和 II比较简单,就连着一起写了 路径总和 I
注意:一定得走到叶子才算 直接看代码吧,注释也就几行。
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…