中级农民
- 积分
- 115
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2019-12-7
- 最后登录
- 1970-1-1
|
补昨天的8月3号,打卡刷题第三天,总结3道题,训练String 6道题,
如果总结对你有帮助,求大米~~
1.RecursionIII MaxPathSum BinaryTree I(from leaf node to leaf node)
subProblem:
子树当中最大的maxPathSum
base case:
if (root == null) -> return 0;
recursive rule:
首先分左右, 然后去使用一个int variable -> curMax 去记录当前最大的maxSum
然后去判断curMax能够合法更新globalMax(m[0])
合法的条件有两个:
第一个是curMax > m[0]
第二个是root.left != null && root.right != null
最后判断有无左右子树的情况,然后视情况return
return 返回有三种情况:
1.右子树为空
返回left + root.key;
2.左子树为空
返回left + root.key;
3.两边都有
返回 Math.max(left, right) + root.key;
2. MaxPathSum BinaryTree II(from any node to any node)
//subProblem:
//root的子树的最大的Max PathSum是什么
//base case
if (root == null) return 0;
//recursive rule:
首先总体上思路是,一个root底下有两个subTree,那么就分别对两个subTree进行讨论,用一个int variable去记录当前的最大的maxSum,因为最后要求的是from any node to any node因此可以用一个new vairable来表示当前值,如果子树返回的是一个负数,那就用0替代(表示不带上子树上的node)
然后带上左右子树和历史上最大值比较,如果比历史最大还要大, 那就更新历史上的最大值
return 返回的是带上当前root的值 + 左右subTree当中最大的那边 Math.max(left, right) + root.value;
3. MaxPathSum BinaryTree III(must in the path from the root node to lead node)
//subProblem:
//root的子树的最大的Max PathSum是什么(在同一个从root到leaf node的这条path上)
//base case
if (root == null) return 0;
//recursive rule:
首先还是分两个方向来进行讨论
左子树和右子树
因为题目条件说的是同一个path上的任意1个或几个, 但是受制于一个path,就只能取一边;
那么就随时新建一个curMax,把左右子树当中大的那个返回(当然如果最大的node笔0还小,就返回0) + root.value;
然后拿这个curMax和历史上的最大值进行比较,更新历史上的最大值(如果适用的话)
return返回的是当前这个root下能够找到的MaxPathSum(curMax)
训练的String题目分别是:
1.reverse a word
2.reverse a sentence
3.right shift by N
4.remove certain element;
5.remove space
6.remove duplication |
|