Aug 15, 2023
Edit me
#. Problem
Go to the problem on leetcode
1. My approach (DFS)
First attempt:
Comparing with ans
at the end of the node.
...
function dfs(root: number, curAmt: number, prevUsed: boolean){
if(!root) {
ans = Math.max(ans, curAmt);
return;
}
...
Problem: It will only calculate and compare one traversal(left one, or right one)
Second attempt:
It has to return value to calculate both traversal(left + right)
...
function dfs(root: number){
if(!root.left && !root.right) {
return root.val;
}
...
Problem: This won’t be able to implement the concept of skipping one for the other one.
Third attempt:
Since it’s bruteforce anyways, let’s give it every possible scenario.
function rob(root: TreeNode | null): number {
function bruteForce(root: TreeNode): [number, number]{
if(!root.left && !root.right) return [root.val, 0];
const [leftUsed, leftNotUsed] = root.left? bruteForce(root.left): [0, 0];
const [rightUsed, rightNotUsed] = root.right? bruteForce(root.right) : [0, 0];
const usingMe = leftNotUsed + rightNotUsed + root.val;
const notUsingMe = Math.max(leftNotUsed + rightNotUsed, leftUsed + rightUsed, leftUsed + rightNotUsed, leftNotUsed + rightUsed);
// Same as: notUsingMe = Math.max(leftUsed, leftNotUsed) + Math.max(rightUsed, rightNotUsed);
return [usingMe, notUsingMe];
};
return Math.max(...bruteForce(root));
};
Worked.
O(N)
3. Epilogue
What I’ve learned from this exercise:
- I need to soften my brain…