golang 线段树实现

本文提供了一种使用Golang实现的LeetCode第307题“区域和检索-数组可修改”的解决方案。通过构建并更新二叉索引树,高效地处理数组的更新操作和范围求和查询。

给出的代码可以解决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
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值