概述
有一个由数字组成的数组。目的是找出该数组的范围之和。什么意思呢?"给定的范围将有一个左索引和一个右索引。我们必须在给定的数组中找到左边索引和右边索引之间的和。
看上去很简单吧。只要在给定的数组中从左边的索引到右边的索引进行迭代,然后返回总和。但这里有一个问题。允许的TC是O(1)
下面是我们可以遵循的方法,这样我们就可以在O(1)的时间复杂度下返回答案了
-
从给定的数字数组中预先计算另一个sum_array
-
sum_array[i] = 从0索引到第i个索引的数字之和。
-
对于一个给定的有左索引和右索引的范围,只需返回sum_array[left-1] - sum_array[right]。当然,我们需要验证left-1是否大于或等于0。
程序
下面是同样的程序。
package main
import "fmt"
type NumArray struct {
sum_nums []int
}
func initNumArray(nums []int) NumArray {
length := len(nums)
sum_nums := make([]int, length)
sum_nums[0] = nums[0]
for i := 1; i < length; i++ {
sum_nums[i] = nums[i] + sum_nums[i-1]
}
return NumArray{
sum_nums: sum_nums,
}
}
func (this *NumArray) SumRange(left int, right int) int {
leftSum := 0
if left > 0 {
leftSum = this.sum_nums[left-1]
}
return this.sum_nums[right] - leftSum
}
func main() {
nums := []int{1, 3, 5, 6, 2}
na := initNumArray(nums)
output := na.SumRange(2, 4)
fmt.Println(output)
}
输出
13