挑战 - 每日系列(Algorithm + TypeChallenge)

83 阅读1分钟

算法小白,2024年2月21日,开始挑战在掘金发布“每日”系列。 (节假日可能会出门所以不算) 涉及到算法,type challenge 等,感兴趣的小伙伴可以持续关注督促互勉 🚀🚀🚀

算法

2583. 二叉树中的第 K 大层和

题意理解

二叉树中一层所有节点值的总和被称为层和,求一棵二叉树中第 K 大的层和

思路

遍历二叉树,求出每一层的层和,使用哈希表保存每层的集层和。最后排序返回第 K 大的层和

解题

const kthLargestLevelSum = (root, k) => {
  const levelMap = new Map()
  const dfs = (node, level) => {
    if (!node) return
    levelMap.set(level, (levelMap.get(level) ?? 0) + node.val)
    dfs(node?.left, level + 1)
    dfs(node?.right, level + 1)
  }
  dfs(root, 0)
  // 转数组从大到小排序
  const res = Array.from(levelMap.values()).sort((a, b) => b - a)
  return k > res.length ? -1 : res[k - 1]
}

TypeChallenge

实现一个类型 AppendToObject<T, S, V> 给接口类型 T 添加字段为 S 的类型 V

interface Todo {
  title: string
  age: num
  sex: string
}

type preview = AppendToObject<Todo, 'a', number>
const preview: preview = {
  title: 'title',
  age: 12,
  sex: '男',
  a: 12
}

思路

  • 可以使用 & 来合并两种接口类型
  • 但是 T & R 这种方式并不等于最终结果,需要做一层转换处理
  • 遍历所有的 key 和 新增的 key,如果已经有值就赋值,没有值就是新增的类型

解题

type Setp1<T, S extends PropertyKey, V> = T & {
  [key in U]: V
}
type Computed<T> = { [key in keyof T]: T[key] }
type Step2<T, S extends PropertyKey, V> = Computed<T & {
  [key in S]: V
}>

或者一步到位

type AppendToObject<T, S extends PropertyKey, V> = {
  [key in keyof T | S]: key extends keyof T ? T[key] : V
}