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

本文完,感谢阅读🌹

相关推荐
2分钟速写快排4 小时前
孔乙己的茴字有多少种写法?|AI 对话实时通信的三种实现
前端·javascript·github
Penge6666 小时前
JavaScript:BOM 详解
前端
Penge6666 小时前
Vite vs Webpack:前端构建工具原理与实战
前端
Penge6666 小时前
前端包管理工具:npm、Yarn、pnpm 快速入门
前端
Penge6667 小时前
Sass 了解
前端
Penge6667 小时前
Webpack 打包从 0 到 1 实战笔记
前端
I_belong_to_jesus7 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Penge6667 小时前
Webpack 入门:是什么、为什么需要、怎么使用?
前端
Penge6667 小时前
Ant Design(Antd)了解
前端
wangruofeng8 小时前
同一行代码,百种渲染:Asuka、React Native 与 Flutter 跨平台渲染机制深度拆解
前端·github