golang 线段树实现

给出的代码可以解决leetcode 307 区域和检索 - 数组可修改

题目地址:https://leetcode-cn.com/problems/range-sum-query-mutable/

题解地址:https://leetcode-cn.com/problems/range-sum-query-mutable/solution/qu-yu-he-jian-suo-shu-zu-ke-xiu-gai-by-leetcode/

实现语言是golang:

type NumArray struct {
	tree   []int
	length int
}

func Constructor(nums []int) NumArray {
	numArray := NumArray{}
	if len(nums) != 0 {
		buildTree(nums, &numArray)
		numArray.length = len(nums)
	}
	return numArray
}

func buildTree(nums []int, numArray *NumArray) {
	n := len(nums)
	numArray.tree = make([]int, len(nums)*2)
	for i, j := n, 0; i < 2*n; i, j = i+1, j+1 {
		numArray.tree[i] = nums[j]
	}
	for i := n - 1; i > 0; i-- {
		numArray.tree[i] = numArray.tree[i*2] + numArray.tree[i*2+1]
	}
}

func (this *NumArray) Update(i int, val int) {
	pos := this.length + i
	this.tree[pos] = val
	for pos > 0 {
		var left = pos
		var right = pos
		if pos%2 == 0 {
			right = pos + 1
		} else {
			left = pos - 1
		}
		this.tree[pos/2] = this.tree[left] + this.tree[right]
		pos /= 2
	}
}

func (this *NumArray) SumRange(i int, j int) int {
	left := i + this.length
	right := j + this.length
	var sum = 0
	for left <= right {
		if left%2 == 1 {
			sum += this.tree[left]
			left++
		}
		if right%2 == 0 {
			sum += this.tree[right]
			right--
		}
		left /= 2
		right /= 2
	}
	return sum
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值