题目链接:力扣
思路:树状数组的单点更新,区间求和。不懂树状数组的可以去网上学习。单点更新和区间求和的时候需要注意一下,因为树状数组是从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)
*/