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
};
相关推荐
wuxia211829 分钟前
微信小程序单击元素切换元素的显示和隐藏
javascript·微信小程序·setdata
lpd_lt41 分钟前
AI Coding的常用Prompt技巧
python·ai·ai编程
小江的记录本43 分钟前
【JVM虚拟机】堆内存分代模型:年轻代(Eden+Survivor)、老年代、元空间Metaspace(附《思维导图》+《面试高频考点清单》)
java·前端·jvm·后端·python·spring·面试
在繁华处1 小时前
Java从零到熟练(三):流程控制
java·开发语言·python
唐青枫1 小时前
Java Optional 实战指南:优雅处理空值与链式转换
java
一起学开源1 小时前
一文读懂 ReAct 范式:让 AI Agent 真正学会“思考+行动“
java·javascript·react.js·ecmascript·react·alibaba·智能体开发
asdzx671 小时前
使用 Python 快速提取 PDF 中的表格
python·pdf
无情的西瓜皮1 小时前
MCP协议实战:用Python从零搭建一个AI Agent工具服务器(保姆级教程)
服务器·人工智能·python·mcp
逍遥德2 小时前
MQTT教程详解-04.SpringBoot集成MQTT(告别手动控制)
java·spring boot·物联网·中间件·iot·iotdb
岁月宁静2 小时前
驾驭 AI 这匹野马:深入解析智能体 Harness 工程
vue.js·python