在Go(Golang)中找出数组范围之和的程序

80 阅读1分钟

概述

有一个由数字组成的数组。目的是找出该数组的范围之和。什么意思呢?"给定的范围将有一个左索引和一个右索引。我们必须在给定的数组中找到左边索引和右边索引之间的和。

看上去很简单吧。只要在给定的数组中从左边的索引到右边的索引进行迭代,然后返回总和。但这里有一个问题。允许的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