typescript实现SortedList(有序列表)
想法源自力扣第88场双周赛最后一题,https://leetcode.cn/problems/number-of-pairs-satisfying-inequality/
有思路但是没有合适的方法,事后看题解发现有人使用了python的SortedList,遂尝试用ts也写一个相同功能的工具类,本质是二分优化的插入排序
此前一直认为插入排序时调用js的Array.splice代价很大,但实际提交后发现其实还挺快的
class SortedList {
public arr: number[]
constructor(list?: number[]) {
if (!list) {
this.arr = []
return
}
this.arr = list.sort((a, b) => a - b)
}
/**
* 添加元素
* @param val 要添加的元素
*/
add(val: number) {
let idx = this.bit_right(val)
this.arr.splice(idx + 1, 0, val)
}
/**
* 二分获取左值
* @param val 目标值
* @return 下标
*/
bit_left(val: number): number {
let start = 0, end = this.arr.length - 1, mid
while (start <= end) {
mid = (start + end) >> 1
if (this.arr[mid] < val) {
start = mid + 1
} else {
end = mid - 1
}
}
return start
}
/**
* 二分获取右值
* @param val 目标值
* @return 下标
*/
bit_right(val: number): number {
let start = 0, end = this.arr.length - 1, mid
while (start <= end) {
mid = (start + end) >> 1
if (this.arr[mid] <= val) {
start = mid + 1
} else {
end = mid - 1
}
}
return end
}
}
/*
~function test() {
let list = new SortedList([1, 3, 2, 2])
list.add(0)
list.add(2)
list.add(4)
console.log(list.arr)
}()
*/

浙公网安备 33010602011771号