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

本文完,感谢阅读🌹

相关推荐
遂心_6 小时前
深入理解 React Hook:useEffect 完全指南
前端·javascript·react.js
Moonbit6 小时前
MoonBit 正式加入 WebAssembly Component Model 官方文档 !
前端·后端·编程语言
龙在天6 小时前
ts中的函数重载
前端
卓伊凡7 小时前
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
前端
前端Hardy7 小时前
HTML&CSS: 谁懂啊!用代码 “擦去”图片雾气
前端·javascript·css
前端Hardy7 小时前
HTML&CSS:好精致的导航栏
前端·javascript·css
Java中文社群7 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
天下无贼7 小时前
【手写组件】 Vue3 + Uniapp 手写一个高颜值日历组件(含跨月补全+今日高亮+选中状态)
前端·vue.js
我是天龙_绍7 小时前
🔹🔹🔹 vue 通信方式 eventBus
前端
一个不爱写代码的瘦子8 小时前
迭代器和生成器
前端·javascript