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
};
相关推荐
咖啡八杯37 分钟前
GoF设计模式——策略模式
java·后端·spring·设计模式
hboot1 小时前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
kyriewen2 小时前
别再 console.log 了:5 个 Chrome DevTools 调试技巧,用过就回不去了
前端·javascript·面试
To_OC4 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
GuWenyue6 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
何时梦醒6 小时前
深入理解递归与快速排序 —— 从基础入门到手写实现
前端·javascript
bonechips6 小时前
LLM 的无状态:从 HTTP 协议到对话上下文工程
前端·javascript
胡志辉6 小时前
从 prototype 到 V8,看懂 JavaScript 原型链
前端·javascript
顾林海6 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
ping某7 小时前
专栏-null 和 undefined 到底是什么?
前端·javascript·后端