前端就该用 JS 刷算法14

96 阅读2分钟

每日一题 -- 树

129. 求根到叶子节点数字之和

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. 二进制手表

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
};