数组的前缀和及查分数组

数组的前缀和及查分数组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)
上一篇 2022年6月11日 下午7:46
下一篇 2022年6月11日 下午7:46


相关推荐

  • java进行四舍五入_java 实现四舍五入功能

    java进行四舍五入_java 实现四舍五入功能告诉你一个小技巧,用4行java代码实现一个四舍五入功能的实例。四舍五入是一种精确度的计数保留法,与其他方法本质相同。但特殊之处在于,采用四舍五入,能使被保留部分的与实际值差值不超过最后一位数量级的二分之一,这种保留法的误差总和是最小的。例子例如π,便被四舍五入,大多保留下3.14了。但是,有的时候不可以用四舍五入的方法,而要用”进一法”和”退一法”。例如,288个学生春游,45人一辆大巴,算下来…

    2022年5月21日
    31
  • pycharm运行出现utf8中文格式问题

    pycharm运行出现utf8中文格式问题改完了数据迁移问题之后终于又要来到了这个界面运行问题了 没想到运行 pythonmanage pyrunserver 之后不是出现之前的这个问题 ps 出现的这个目标卷轴不正确的问题 最终解决的方法是重新用 cmd 建了项目 把 manage py 文件移动到了根目录下最终也能成功运行了 而是出现了 utf 8 的编码问题参考了博主的文章 https blog csdn net Beyond F4 article details 每一个都试了之后还是不行然后就自己

    2026年3月27日
    2
  • python操作windows窗口获取窗口句柄「建议收藏」

    python操作windows窗口获取窗口句柄「建议收藏」python获取窗口句柄在Windows下获取窗口句柄时操作系统版本和软件版本对获取有影响,就会出现在本地调试正常的程序,交付使用的时候报错。查看windows所有可显示的窗口句柄及窗口名称。#-*-coding:utf-8-*-“””FileNamewindows_guiCreatedon2019-11-06@author:jj”””importwin…

    2022年7月14日
    43
  • CmakeList的编写和参数详解「建议收藏」

    CmakeList的编写和参数详解「建议收藏」CmakeList的编写和参数详解

    2025年5月25日
    5
  • 配置阿里云yum源

    配置阿里云yum源2 下载 aliyun centos8 镜像文件 1 进入到 yum 源配置文件

    2026年3月26日
    2
  • 【离散数学】单射、满射、双射、映射的合成与逆映射

    【离散数学】单射、满射、双射、映射的合成与逆映射单射、满射、双射、映射的合成与逆映射

    2022年5月15日
    207

发表回复

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

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