30 天刷题挑战(十三)

题目来源: LeetCode 75 30 天 JavaScript 挑战

2631. 分组

思路

代码

ts 复制代码
Array.prototype.groupBy = function(fn) {
  const obj = {}

  for (let i = 0; i < this.length; i++) {
    const key = fn(this[i])
    if (!obj.hasOwnProperty(key)) {
      obj[key] = []
    }
    obj[key].push(this[i])
  }

  return obj
}

2724. 排序方式

思路

代码

ts 复制代码
function sortBy(arr: JSONValue[], fn: Fn): JSONValue[] {
  return arr.sort((a, b) => fn(a) - fn(b))
};

872. 叶子相似的树

思路

深度优先搜索找出每一个子节点,最后使用 toString 对比两个数组

代码

ts 复制代码
function leafSimilar(root1: TreeNode | null, root2: TreeNode | null): boolean {
  const root1Arr = []
  const root2Arr = []

   if (root1) {
     dfs(root1, root1Arr)
   }

   if (root2) {
     dfs(root2, root2Arr)
   }
  
   return root1Arr.toString() === root2Arr.toString()
};

function dfs(root, arr) {
  if (!root.left && !root.right) {
    arr.push(root.val)
  } else {
    if (root.left) {
      dfs(root.left, arr)
    }
    if (root.right) {
      dfs(root.right, arr)
    }
  }
}

1448. 统计二叉树中好节点的数目

思路

如果节点为空返回 0,递归分别获取左右子树的好节点 left, right,最后判断 max 是否大于根节点的值。

代码

ts 复制代码
function goodNodes(root: TreeNode | null, max = -Infinity): number {
  if (root === null) {
    return 0
  }
  
  const left = goodNodes(root.left, Math.max(max, root.val))
  const right = goodNodes(root.right, Math.max(max, root.val))
  
  return left + right + (max <= root.val ? 1 : 0)
};

437. 路径总和 III

思路

双重递归访问每一个节点,如果节点值等于 targetSum 说明符合要求结果加一。每到下一层 targetSum 减等于节点值。

代码

js 复制代码
const pathSum = function(root, targetSum) {
    if (root == null) {
      return 0;
    }
    
    let count = rootSum(root, targetSum);
    count += pathSum(root.left, targetSum);
    count += pathSum(root.right, targetSum);

    return count;
};

const rootSum = (root, targetSum) => {
    let ret = 0;

    if (root == null) {
      return 0;
    }

    const val = root.val;

    if (val === targetSum) {
        ret++;
    } 

    ret += rootSum(root.left, targetSum - val);
    ret += rootSum(root.right, targetSum - val);

    return ret;
}

本文完,感谢阅读🌹

相关推荐
姑苏洛言1 分钟前
扫码小程序实现仓库进销存管理中遇到的问题 setStorageSync 存储大小限制错误解决方案
前端·后端
我想进大厂6 分钟前
图论---朴素Prim(稠密图)
数据结构·c++·算法·图论
我想进大厂11 分钟前
图论---Bellman-Ford算法
数据结构·c++·算法·图论
烛阴12 分钟前
JavaScript 的 8 大“阴间陷阱”,你绝对踩过!99% 程序员崩溃瞬间
前端·javascript·面试
AIGC大时代13 分钟前
高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
数据库·人工智能·算法·aigc·智能写作·deepseek
lh_125442 分钟前
ECharts 地图开发入门
前端·javascript·echarts
jjw_zyfx44 分钟前
成熟的前端vue vite websocket,Django后端实现方案包含主动断开websocket连接的实现
前端·vue.js·websocket
CODE_RabbitV1 小时前
【深度强化学习 DRL 快速实践】近端策略优化 (PPO)
算法
Mikey_n1 小时前
前台调用接口的方式及速率对比
前端
周之鸥1 小时前
使用 Electron 打包可执行文件和资源:完整实战教程
前端·javascript·electron