js 实现python的SortedList有序集合

力扣(LeetCode)- 327. 区间和的个数(JavaScript)

这题用到了有序集合,但是js没有这种集合总是超时。手动实现如下。

复制代码
// 默认比较器,处理NaN,规则和Python保持一致:NaN比任何数大,两个NaN相等
function defaultCompare(a, b) {
  if (Number.isNaN(a) && Number.isNaN(b)) return 0;
  if (Number.isNaN(a)) return 1;
  if (Number.isNaN(b)) return -1;
  if (a < b) return -1;
  if (a > b) return 1;
  return 0;
}

class SortedList {
    constructor(items = [], options = []) {
        if (options.compare) {
            this.compare = options.compare
        } else {
            this.compare = defaultCompare
        }
        // 内部存储数组,初始就排序
        this._arr = [...items].sort(this.compare);
    }

    bisectLeft(target) {
        let low = 0
        let high = this._arr.length
        while (low < high) {
            const mid = Math.trunc((low + high) / 2)
            if (this.compare(this._arr[mid], target) < 0) {
                low = mid + 1
            } else {
                high = mid
            }
        }
        return low
    }

    bisectRight(target) {
        let low = 0
        let high = this._arr.length
        while (low < high) {
            const mid = Math.trunc((low + high) / 2)
            if (this.compare(this._arr[mid], target) <= 0) {
                low = mid + 1
            } else {
                high = mid
            }
        }
        return low
    }

    add(item) {
        const pos = this.bisectLeft(item);
        this._arr.splice(pos, 0, item);
    }
}

这题解答方法

复制代码
var countRangeSum = function(nums, lower, upper) {
    const len = nums.length;
    let count = 0
    let sum = 0
    const list = new SortedList([0])
    for (let i = 0;i < len;i++) {
        sum += nums[i]
        const left = list.bisectLeft(sum - upper)
        const right = list.bisectRight(sum - lower)
        count += right - left
        list.add(sum)
    }
    return count
};
相关推荐
wuqingshun31415918 分钟前
什么是责任链模式,一般用在什么场景?
java·责任链模式
:-)1 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
鱼樱前端1 小时前
别再自己拼凑了!这款 Vue 3.5+ 严肃产品级组件库,把 AI 对话、工作流和复杂数据全包了!
javascript·vue.js·github
wuqingshun3141591 小时前
说一下消息队列的模型有哪些?
java
Listen·Rain2 小时前
Vue3:setup详解
前端·javascript·vue.js
fīɡЙtīиɡ ℡2 小时前
布隆过滤器
java
yaoxin5211233 小时前
462. Java 反射 - 获取声明类与封闭类
java·开发语言·python
kyriewen3 小时前
面试官让我优化一个卡死的表格,我打开 Claude 五秒重写,他放下咖啡问我要不要来当组长
前端·javascript·面试
中微极客3 小时前
解锁LLM开发全栈能力:Python + LangChain + RAG 工程实战指南
人工智能·python·langchain
hhzz3 小时前
Barbershop:基于GAN和分割Mask的图像合成技术——从理论到实战全解析
图像处理·人工智能·python·深度学习·计算机视觉