题目来源: 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;
}
本文完,感谢阅读🌹