每日一题 -- 树
129. 求根到叶子节点数字之和
// 129. 求根到叶子节点数字之和
// https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/
/**
* @分析
* 1. 自顶向下,每次递归向下的时候,需要带一个临时的值
* 2. 当到底叶子节点,就返回并将临时值加到真正的值里面
*/
var sumNumbers = function(root) {
if(!root) return 0
let res = 0
const dfs = (root,temp) => {
const cur=temp*10+root.val
if(!root.left && !root.right){
// 已经是根节点
res+=cur
return
}
if(root.left){
dfs(root.left,cur)
}
if(root.right){
dfs(root.right,cur)
}
}
dfs(root,0)
return res
};
91算法 -- 搜索
401. 二进制手表
踩坑历程
- 这个题目一开始其实没有想到怎么取球,是看了题解,晓得了一种根据下标 pos 不同,递归获取不一样状态的取法
- 刚开始把 num 和 start 看错是一样的指代,所以只用了一个值
- 因此一开始也一直就觉到底 n 的值是取 8,还是 10
- 最后发现一个是指代获取的值,一个是指代分区,才明白到自己思路有问题
- 以上,得出结论,简单题才是难题啊。
// 401. 二进制手表
// https://leetcode-cn.com/problems/binary-watch/
/**
* @分析
* 1. 小时最多只能由3个亮,否则会被撤销,同理,分钟最多也只能是5个
* 2. 所以如果 num>8,则直接 return
*
* @注意
* 1. n 和 start 的值虽然是一增一减,但是代表的意义不一样,
* 2. n 是跟取数有关,而 start 是为了区分取 `时区` 还是 `分区` 设计的一个遍历
* 3. 所以如果没有时分区之分,start 变量就不存在
* 4. 同样的,num 最大是 8,因为超出 8 的都不符合要求
* 5. 而 start 的最大值是10,因为总共给出 10 个灯,需要将他们都遍历了
*/
var readBinaryWatch = function (num) {
if (num > 8) return []
const res = []
const dfs = (n,start,h,m) => {
if(h>11 || m>59) return
if(n === 0) {
return res.push(`${h}:${m>9?m:'0'+m}`)
}
for (let i = start; i < 10; i++) {
// n 是已经取了 n 个值,这里遍历过程中,所有情况都只是减少一次取值
// start 是判断取值位置,这里是先取 min,当 start>5 的时候,开始取 hour
dfs(n-1,i+1,h+(i>5?Math.pow(2,i-6):0),m+(i>5?0:Math.pow(2,i)))
}
}
dfs(num,0,0,0)
return res
};