307. 区域和检索 - 数组可修改
Posted 心脏dance
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了307. 区域和检索 - 数组可修改相关的知识,希望对你有一定的参考价值。
题目链接:力扣
思路:树状数组的单点更新,区间求和。不懂树状数组的可以去网上学习。单点更新和区间求和的时候需要注意一下,因为树状数组是从1开始的,所以单点更新的时候需要更新的位置为 index+1 ,区间求和的时候需要 right + 1 减 left(这个地方大家自己思考一下,还是不懂的可以在评论区指出哦~~~)
上代码:
class NumArray(nums: IntArray)
private val c = IntArray(nums.size + 1)
private var mNums = IntArray(nums.size)
init
mNums = nums
for (i in nums.indices)
buildTree(i + 1, nums[i])
fun update(index: Int, `val`: Int)
buildTree(index + 1, `val` - mNums[index])
mNums[index] = `val`
fun sumRange(left: Int, right: Int): Int
return getSum(right + 1) - getSum(left)
private fun buildTree(index: Int, `val`: Int)
var mIndex = index
while (mIndex < c.size)
c[mIndex] += `val`
mIndex += lowbit(mIndex)
private fun getSum(index: Int): Int
var mIndex = index
var result = 0
while (mIndex > 0)
result += c[mIndex]
mIndex -= lowbit(mIndex)
return result
private fun lowbit(x: Int): Int
return x and -x
/**
* Your NumArray object will be instantiated and called as such:
* var obj = NumArray(nums)
* obj.update(index,`val`)
* var param_2 = obj.sumRange(left,right)
*/
以上是关于307. 区域和检索 - 数组可修改的主要内容,如果未能解决你的问题,请参考以下文章