数组的前缀和及查分数组

数组的前缀和及查分数组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


相关推荐

  • ER图是什么?「建议收藏」

    ER图是什么?「建议收藏」ER图分为实体、属性、关系三个核心部分。实体是长方形体现,而属性则是椭圆形,关系为菱形。ER图的实体(entity)即数据模型中的数据对象,例如人、学生、音乐都可以作为一个数据对象,用长方体来表示,每个实体都有自己的实体成员(entitymember)或者说实体对象(entityinstance),例如学生实体里包括张三、李四等,实体成员(entitymember)/实体实例(entityinstance)不需要出现在ER图中。ER图的属性(attribute)即数据对象所具有的属

    2026年2月20日
    4
  • HttpClient4.x 使用cookie保持会话

    HttpClient4.x 使用cookie保持会话HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的“执行get请求”部分)。如果需要使用HttpClient池,并且想要做到一次登录的会话供多个HttpClient连接使用,就需要自己保存会话信息。因为客户端的会话信息是保存在cookie中的(JSESSIONID),所

    2022年7月22日
    13
  • iis默认路径_服务器配置文件在哪

    iis默认路径_服务器配置文件在哪本文的性质为“编著”。“图形化网站管理者”请留步。 问题:当主机上的IIS服务由于各种原因无法打开时,无法看到当前系统内已经部署了哪些网站,以及其对应的目录等信息。为解决这一问题,本文通过查看IIS服务器的配置文件来获取系统内已部署网站的信息。 可能的“误导”预警:配置文件的信息与IIS的版本有关系,但本文仅为了解决问题,将操作系统与IIS版本混在了一起。 对win

    2026年4月13日
    4
  • 三目运算符 c语言求最小值,三目运算符

    三目运算符 c语言求最小值,三目运算符下面给大家介绍一下三目运算符首先介绍一个概念 所谓的 目 是指这个运算符参与运算的对象个数比如前面我们介绍了 等等运算符 这些需要两个数或者变量运算 所以就属于双目运算符 而 和一个对象就可以组合 这种就是单目运算符 很好理解 那么今天所提到的三目 当然就是有三个对象参与运算了 这可是 C 语言当中唯一一个三目运算符哦 就是选择运算符它的一般形式是通过 和 两个符合组合而成的 一般形

    2026年3月17日
    2
  • Python map函数

    Python map函数格式 map func seq1 seq2 第一个参数接受一个函数名 后面的参数接受一个或多个可迭代的序列 返回的是一个集合 Python 函数编程中的 map 函数是将 func 作用于 seq 中的每一个元素 并将所有的调用的结果作为一个 list 返回 如果 func 为 None 作用同 zip 1 当 seq 只有一个时 将函数 func 作用于这个 seq 的每个元素上 并得到一个新的 seq

    2026年3月19日
    2
  • 各个刷流量软件总结对比

    各个刷流量软件总结对比1流量精灵从官网上看挂了大半天平均每个网址就可以有一千个IP(一般流量精灵只能刷三个网址,我是自己的电脑和虚拟机一起开,虚拟机只能刷两个网址)效果很理想,估计一天下来五千个IP没有问题.而实际查看一个网页的浏览量只有两三百.可见流量精灵也不过是招摇撞骗,把我们辛辛苦苦的流量都偷走了.2流量宝流量获取情况:累积在线五个小时,获取的695个IP,刷三个网…

    2026年4月18日
    4

发表回复

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

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