区域和检索 - 数据不可变

惰性计算

class NumArray {
  private nums: number[]
  private index = 0
  constructor(nums: number[]) {
    this.nums = nums
  }

  private getNum(i: number): number {
    if (this.nums[i] === undefined) return 0
    return this.nums[i]
  }

  sumRange(left: number, right: number): number {
    // 当右标超出已计算区间才进行计算
    if (right > this.index) {
      for (let i = this.index + 1; i <= right; i++) {
        this.nums[i] = this.getNum(i - 1) + this.nums[i] 
      }
      this.index = right
    }

    return this.nums[right] - this.getNum(left - 1)
  }
}