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
};
相关推荐
夏幻灵2 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
三天不学习3 小时前
Egg.js 4 突然爆火,原因是否归结于AI 原生落地需求爆发?
前端·javascript·全栈·egg.js
xcs194054 小时前
前端 vue 的前端页面debugger 进不去
前端·javascript·vue.js
代码什么用4 小时前
Spring基础使用
java·后端·spring
Su米苏5 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
码云数智-园园5 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁5 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网5 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
禾小西6 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨6 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言