数组的前缀和及查分数组

数组的前缀和及查分数组1,前缀和主要适用场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。这里就不写前缀和的代码了,就是用一个数组记录下原有数组的前缀和。比如,prefix[i]就代表着nums[0…i-1]所有元素的累加和,如果我们想求区间nums[i…j]的累加和,只要计算prefix[j+1]-prefix[i]即可,而不需要遍历整个区间求和。(需要注意的是使用场景是频繁查询某个区间的累加和,而不需要对原始数组进行频繁修改)2,查分数组的主要适用场景是**频繁对原始数组的某个区间的元素进行增减。**比

大家好,又见面了,我是你们的朋友全栈君。

1,前缀和主要适用场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。
这里就不写前缀和的代码了,就是用一个数组记录下原有数组的前缀和。比如,prefix[i]就代表着nums[0…i-1]所有元素的累加和,如果我们想求区间nums[i…j]的累加和,只要计算prefix[j + 1] – prefix[i]即可,而不需要遍历整个区间求和。(需要注意的是使用场景是频繁查询某个区间的累加和,而不需要对原始数组进行频繁修改)
2,查分数组的主要适用场景是**频繁对原始数组的某个区间的元素进行增减。**比如说,给定一个数组nums,要求给区间nums[2…6]全部加1,再给nums[3…9]全部减3,再给nums[0…4]全部加2,等等。当然可以使用for循环挨个处理,但是可以利用查分数组来达到O(1)复杂度就可以完成某个动作。diff[i]就是nums[i]和nums[i – 1]之差。比如:
nums: 8 5 9 6 1
diff: 8 -3 4 -3 -5
首先可以通过这个数组来还原原来的数组,也可以利用O(1)复杂度完成给nums[i…j]全部加val的操作。只需两步即可,第一步:diff[i] += val, 这意味着nums[i…]的值全都加val,第二步:diff[j + 1] -= val(j + 1 < size),这意味着nums[j + 1…]的值全都减val,因为第一步加了。

class Difference{ 
   
    private:
        vector<int> diff;
    public:
        Difference(vector<int>& nums){ 
   
            diff.push_back(nums[0]);

            for(int i = 1; i < nums.size(); i++){ 
   
                diff.push_back(nums[i] - nums[i - 1]);
            }
        }

        void increment(int i, int j, int val){ 
   
            diff[i] += val;
            if(j + 1 < diff.size()){ 
   
                diff[j + 1] -= val;
            }
        }

        vector<int> result(){ 
   
            vector<int> vec;

            vec.push_back(diff[0]);

            for(int i = 1; i < diff.size(); i++){ 
   
                vec.push_back(vec.back() + diff[i]);
            } 

            return vec;
        }
    };
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131828.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 回溯法之n皇后问题总结_用回溯法求解n皇后问题的思路

    回溯法之n皇后问题总结_用回溯法求解n皇后问题的思路一、问题在nxn格的棋盘上放置彼此不受攻击的n格皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nxn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。二、算法与分析用数组x[i](1≤i≤n)表示n后问题的解。其中x[i]表示皇后i放在棋盘的第i行的第x[i]列。由于不允许将2个皇后放在同一列,所以解向量中的x[i]…

    2022年9月30日
    4
  • java面向对象的三大特性

    java面向对象的三大特性java面向对象的三大特性包括:封装、继承、多态一、封装1.含义:封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系。也就是说用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作就行。2.封装的实现需要修改属性的访问控制符(修改为private);创建getter/setter方

    2022年7月9日
    21
  • python和c++哪个好_run pycharm community edition

    python和c++哪个好_run pycharm community edition在pycharm中使用django命令的过程中经常会用到pythonmanage.py相关的命令,每次都输入pythonmanage.py会比较麻烦,可以利用pycharm提供的tools来省去pythonmanage.py的重复输入。具体实现过程如下:先进入settings完成如下操作随后可勾选Tools中的Runmanage.pyTask完成后即可以直接输入manag…

    2022年8月26日
    7
  • Databus 调研测试

    Databus 调研测试1.简介Databus是一个低延迟、可靠的、支持事务的、保持一致性的数据变更抓取系统。由LinkedIn于2013年开源。Databus通过挖掘数据库日志的方式,将数据库变更实时、可靠的从数据库拉取出来,业务可以通过定制化client实时获取变更并进行其他业务逻辑。Databus有以下特点:数据源和消费者之间的隔离。数据传输能保证顺序性和至少一次交付的高可用性。从变化流的任意时间点进行消费,包括…

    2022年10月17日
    2
  • python进制转换函数

    python进制转换函数一:二,八,十六进制转十进制注意2进制对应的数值范围只能是0和1,超过范围会报错,8进制和16进制同理。print(int(‘100′,2))#二进制转十进制,int(’20’,2)会报错print(int(’30’,8))#八进制转十进制,int(’80’,8)会报错print(int(‘f0’,16))#十六进制转十进制,int(‘g0’,16)会报错二:十进制转二进制、八进制、十六进制。内置函数bin、oct、hex得到的进制前面会分别带有’0b’,‘0o’,’0x’字符。

    2022年5月12日
    67
  • springboot实战第四章-SpringMVC的文件上传配置

    springboot实战第四章-SpringMVC的文件上传配置

    2021年5月15日
    124

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号