harttle / contest.js

Ready for contest use! Data structures and algorithms in pure JavaScript with zero dependency.
http://harttle.land/contest.js/
MIT License
41 stars 9 forks source link

feat(treeset): support reverse traverse the tree set #13

Closed upupming closed 2 years ago

upupming commented 2 years ago

LeetCode 题目: https://leetcode.com/problems/maximum-number-of-tasks-you-can-assign/submissions/

这个题目按照智颠老师的解法需要用到类似 C++ 的 end() 这个功能(不过其实用 lower_bould 也可以解),但是我们的 set 现在只能正向遍历,拿不到最大的数。因此添加了这个功能

这道题的 TS 代码:

function maxTaskAssign (tasks: number[], workers: number[], pills: number, strength: number): number {
  const n = tasks.length
  tasks.sort((a, b) => a - b)
  workers.sort((a, b) => a - b)
  let [l, r] = [0, n]
  while (l < r) {
    const mid = l + r + 1 >> 1
    if (valid(mid)) l = mid
    else r = mid - 1
  }
  return l
  function valid (cnt: number) {
    const s = new TreeMultiSet(workers)
    let rest = pills
    for (let i = cnt - 1; i >= 0; i--) {
      // 这里其实直接用 rvalues() 拿最大的 worker 就行了(因为留下来也是浪费,只能去处理更小的 task 了,用最大的 worker 不会更坏),也可以用最后一个元素判断是否 >= task[i]
      let v = s.ceiling(tasks[i])
      if (v != null) { s.delete(v)
        // console.log(cnt, i, tasks[i], v, 'cnt', s.count(v))
      }
      else {
        // 找到最小的 worker, worker + strength 刚好能够到达
        v = s.ceiling(tasks[i] - strength)
        if (rest && v != null) {
          rest--
          s.delete(v)
          console.log(cnt, i, tasks[i], v, strength)
        } else {
          return false
        }
      }
    }
    return true
  }
};

另外添加了 tsup 配置,现在编译速度更加快了。

coveralls commented 2 years ago

Pull Request Test Coverage Report for Build 1519334348


Totals Coverage Status
Change from base Build 1064852108: 0.5%
Covered Lines: 674
Relevant Lines: 762

💛 - Coveralls
harttle commented 2 years ago

我想同时维护一份js版本在源码里,你怎么看?

upupming commented 2 years ago

我想同时维护一份js版本在源码里,你怎么看?

可以的珺神!js版本是完全重写嘛?确实我发现ts在有些地方没有js灵活,特别是bigint和number同时支持的话要写两遍,因为两者不能直接相加。再加上生成的js代码总归是有些冗余的信息。

如果只是当前需要编译不方便的话,我们其实可以做一个类似 vue sfc, rollupjs repl, play-esbuild 这样的前端页面,把我们的测试用例展示在前端,然后要 copy 的代码也展示 TS/JS 两个版本,就非常方便了。