`

Range Sum Query - Mutable

阅读更多
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.

The update(i, val) function modifies nums by updating the element at index i to val.
Example:
Given nums = [1, 3, 5]

sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8

Note:
The array is only modifiable by the update function.
You may assume the number of calls to update and sumRange function is distributed evenly.

这道题目与Range Sum Query - Immutable这道题相比多了一个update方法,这样我们就没法通过提前计算好sum来提高运算速度了。在这里我们介绍一种新的数据结构来解决这道题——树状数组(Binary Indexed tree)。这里简单介绍一下如何构造一个树状数组。
假设 给定一个数组nums[]。sumRange方法求其中连续多个数的和,update方法用来任意修改其中一个元素。下面我们构造树状数组BIT[]。其中的任意一个元素BIT[i]可能是一个或者多个nums数组中元素的和。我们如何确定BIT[i]包含的元素呢,这里我们用位运算的知识来处理。假设i的二进制表示中有k位连续的0,那么它就是数组nums中下面小于i的前2^k个元素的和。
注 *构造BIT数组时,BIT[0] = 0,代表空,
例如:
BIT[1] = nums[0] (1的二进制表示为0001,k = 0, 2 ^ k = 1, 因此只包含nums[0]).
BIT[2] = nums[0] + nums[1] (2 = 0010, k = 1, 2 ^ k = 2, 因此包含前两个元素).
BIT[3] = nums[2] (3 = 0011, k = 0, 2 ^ k = 1, 因此只包含一个紧邻3并且比3小的元素nums[2])
构建好BIT,这道题目就解决了,时间复杂度为O(logn), 代码如下:
public class NumArray {
    int[] nums;
    int[] BIT;
    
    public NumArray(int[] nums) {
        this.nums = nums;
        BIT = new int[nums.length + 1];
        for(int i = 0; i < nums.length; i++) {
            init(i, nums[i]);
        }
    }
    public void init(int i, int val) {
        i ++;
        while(i <= nums.length) {
            BIT[i] += val;
            i += (i & -i);
        }
    }
    void update(int i, int val) {
        int differ = val - nums[i];
        nums[i] = val;
        init(i, differ);
    }
    public int getSum(int i) {
        i ++;
        int sum = 0;
        while(i > 0) {
            sum += BIT[i];
            i -= (i & -i);
        }
        return sum;
    }
    public int sumRange(int i, int j) {
        return getSum(j) - getSum(i - 1);
    }
}


// Your NumArray object will be instantiated and called as such:
// NumArray numArray = new NumArray(nums);
// numArray.sumRange(0, 1);
// numArray.update(1, 10);
// numArray.sumRange(1, 2);
分享到:
评论

相关推荐

    java-leetcode题解之Range Sum Query - Mutable.java

    java java_leetcode题解之Range Sum Query - Mutable.java

    java-leetcode题解之Range Sum Query 2D - Mutable.java

    java java_leetcode题解之Range Sum Query 2D - Mutable.java

    Laravel开发-eloquence-mutable

    "Laravel开发-eloquence-mutable"项目就是为了这样的目的而设计的,它为Eloquent添加了更多实用特性,提高了ORM的灵活性和实用性。 1. **可搜索性**: eloquence-mutable扩展增强了Eloquent模型的搜索功能。它允许...

    samcat2021#ZXBlog#树状数组总结1

    LeetCode - 307. Range Sum Query - Mutable例题:题目:树状数组代码:// 树状数组中求和的数组//真实存放数据的数组pr

    Leetcode代码以及解答(2)

    Range Sum Query - Mutable **知识点:** - **问题描述:** - 给定一个可修改的整数数组,需要支持高效查询任意两个索引之间的元素之和,并且支持单个元素的更新。 - **解决方案分析:** - **线段树:** - ...

    LeetCode最全代码

    201 | [Bitwise AND of Numbers Range](https://leetcode.com/problems/bitwise-and-of-numbers-range/) | [C++](./C++/bitwise-and-of-numbers-range.cpp) [Python](./Python/bitwise-and-of-numbers-range.py) | _...

    react-mutable-list:React的可拖动,可拖放和可删除列表组件

    npm install react-mutable-list 功能以三种不同的方式公开: src/ es6 / jsx文件 在lib/具有commonJS导出的es5文件 一个预打包的版本,其中整个React库位于dist/list.js 例子 此示例显示用户如何处理onReorder和...

    Python_leetcode.zip

    "range-sum-query-mutable.py"涉及动态规划和区间查询。在动态规划中,我们需要设计一个数据结构,能够支持快速的区间求和和修改操作。Python的列表和动态规划思想结合,可以实现高效的数据结构设计,为这类问题提供...

    详解C++中mutable的用法

    这时,就可以使用mutable关键字。mutable是C++中用于标示某个成员变量可以被const成员函数修改的修饰符。即使该对象为常量,我们仍然可以修改这个成员变量的值。以下是关于C++中mutable用法的详细知识点。 1. **...

    mutable-dev-environment:Mutable Instruments产品固件的开发环境

    易变的环境,适用于Mutable Instruments模块黑客 该配置文件和此shellscript创建了一个Linux(ubuntu)虚拟机,该虚拟机配置有用于编译和安装Mutable Instruments模块的固件的所有正确工具。 荣誉和灵感 Adafruit的 ...

    聊聊C++的mutable和volatile

    C++中修饰数据可变的关键字有三个:const、volatile和mutable。const比较好理解,表示其修饰的内容不可改变(至少编译期不可改变),而volatile和mutable恰好相反,指示数据总是可变的。mutable和volatile均可以和...

    Get Programming - Learn to code with Python.epub

    Lesson 24 - Mutable and immutable objects Lesson 25 - Working with lists Lesson 26 - Advanced operations with lists Lesson 27 - Dictionaries as maps between objects Lesson 28 - Aliasing and copying ...

    mutable-dev-environment, 可变仪器产品固件的开发环境.zip

    mutable-dev-environment, 可变仪器产品固件的开发环境 用于静音仪器模块黑客的环境这个配置文件和shellscript创建了一个配置了所有正确工具来编译和安装可变仪表模块模块的Linux ( ubuntu ) 虚拟机。的荣誉和灵感...

    Mutable-Template:可变模板是一种模板格式,用于更新模板本身的内容

    npm install -g mutable-template 您可能需要使用sudo运行命令(在Linux / OS X上)或以管理员身份运行命令提示符(在Windows上)。 用法 命令行工具 输入以下命令以查看可变模板的CLI使用情况。 $ mutable-...

    shruthi-xt-enclosure:Mutable Instruments Shruthi XT单合成器的木质外壳的计划和零件

    Shruthi XT机箱 我的木制Shruthi XT外壳的设计和零件,可以选择在激光上雕刻有灵感源自原始设计的图形。 零件设计为在CNC铣床上粗切,然后手工精加工和修整。档案文件该计划最初是使用Mac版Eazydraw绘制的。...

    ambika-case:Mutable Instruments Ambika的案例和面板文件

    Mutable Instruments Ambika的案例和面板文件 笔记: 已将Panel SVG文件设置为在svg2shenzhen扩展名的Inkscape中使用,以导出Gerber。 机箱+脸颊文件有两种类型,具体取决于在顶面板和主板之间使用的长度支架。 ...

    c++关键字mutable深入解析

    在C++编程语言中,`mutable`是一个特殊的关键字,它的主要作用是允许在const成员函数内部修改对象的成员变量。通常,const成员函数承诺不修改对象的状态,但`mutable`关键字提供了一种机制,使得程序员可以在保持...

    mutable-global:可变全局变量的进出口

    注意:该建议已在上游合并,在此不再进行更新。 WebAssembly的可变全球提案 ... 它旨在用于讨论,原型规范以及为WebAssembly添加可变全局变量的提案的实现。 有关建议的摘要,请参见。 该规范的格式版本(包括此建议...

    Python库 | torch_mutable_modules-1.1.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:torch_mutable_modules-1.1.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

Global site tag (gtag.js) - Google Analytics