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. 区域和检索 - 数组可修改的主要内容,如果未能解决你的问题,请参考以下文章

[307]. 区域和检索 - 数组可修改

LeetCode 307. 区域和检索 - 数组可修改

307. 区域和检索 - 数组可修改

[Leetcode] 第307题 区域和检索-数组可修改

307.区域与检索--数组可修改

LeetCode 307. 区域和检索 - 数组可修改