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)
}()
*/
posted @ 2022-10-02 01:25  ぃ往事深处少年蓝べ  阅读(418)  评论(0)    收藏  举报