首页 > 其他分享 >差分数组,经常在数组某段区间内统一进行加减相同值

差分数组,经常在数组某段区间内统一进行加减相同值

时间:2023-05-30 16:37:01浏览次数:29  
标签:前缀 某段 元素 加减 差分 数组 区间 统一


假设某一数组d经常做在某一段区间[a,b]内统一进行加减的操作,由于每次进行操作都需要从a循环遍历到b,时间开销较大,所以可以采用差分数组来解决此类问题.
设数组d[]={8,1,3,6,5,4,2}
当需要在区间[0,3]上统一加3时,不采用循环的方式,而是新创建一数组c,初始每个下标上的值均为0,则:
在c[0]上+3变成3,在c[3+1]上-3变成-3;
此时,c数组:3,0,0,0,-3,0,0;

同理,当需要在[2,5]上统一加4时,让c[2]+4=4,c[5+1]-4=-4,此时,c数组
3,0,4,0,-3,0,-4;

再当需要在[1-6]上-2时,由于6已经是数组最后一个元素,所以只需要在c[1]上-2即可,(c[6+1]不存在)
此时c数组:3,-2,4,0,-3,0,-4

之后,求出c数组的前缀和数组:
3,1,5,5,2,2,-2;

将原始数组d中的每个元素分别加上前缀和数组中的每一个元素,产生一个新的数组
a:[11,2,8,11,7,6,0],该数组即为最终执行结果.

假设进行m次在数组区间进行统一加减的操作,暴力算法的则时间复杂度mO(b-a),
此种算法由于每次只在c数组上改变两个元素,所以是m
2次,又因最后需要算前缀和数组,以及前缀和数组与初始数组相加,是2O(N),所以优化后一共的时间复杂度是2(m+O(N))

差分数组,经常在数组某段区间内统一进行加减相同值_时间复杂度


标签:前缀,某段,元素,加减,差分,数组,区间,统一
From: https://blog.51cto.com/u_16144724/6380341

相关文章

  • 442. 数组中重复的数据
     思路难度中等714给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1,n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此......
  • 第八单元 数组与集合
    1.数组(Array)数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。声明数组变量并不是声明number0、number1、...、number99一个个单独的变量,而是声明一个就像numbers这样的变量,然后使用numbers[0]、numbers[......
  • 两个有序数组的第K小乘积
    给你两个从小到大排好序 且下标从0 开始的整数数组 nums1和 nums2 以及一个整数 k 请你返回第 k (从1 开始编号)小的 nums1[i]*nums2[j] 的乘积1.二分查找classSolution{public:typedeflonglongll;longlongkthSmallestProduct(vector<int>&......
  • 代码随想录算法训练营第六天|哈希表理论基础、242.有效的字母异位词两个数组的交集、2
    242.有效的字母异位词力扣题目链接(opensnewwindow)给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例 1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:false说明: 你可以假设字符串只包含小写字母。思路:......
  • hdu 3874(树状数组+离线算法)
    解题思路:这道题和之前的题一样,查找[l,r]区间内不重复数字的和。可以利用离线算法,实际上离线算法为了解决在查找时出现的矛盾,因为每次询问的区间大小不同,如果单独处理的话可能会对之后的查询有影响,所以离线算法帮助我们把要查询的区间先按照右端点进行排序,因为在处理更靠右的区间时,......
  • poj 1201(差分约束)
    IntervalsTimeLimit: 2000MS MemoryLimit: 65536KTotalSubmissions: 23934 Accepted: 9075DescriptionYouaregivennclosed,integerintervals[ai,bi]andnintegersc1,...,cn. Writeaprogramthat: readsthenumberofintervals,the......
  • hdu 1534(差分约束)
    题意:安排计划,有4种约束方式,给出你这些时间的n个约束..如果计划是可行的,求出每一件事发生的最早时间..否则输出“impossible”..①.FAFaba要在b完成后完成..②.FASaba要在b开始前完成..③.SASaba要在b开始前开始..④.SAFaba要在b结束前开......
  • 2023-05-29:给你一个由 n 个正整数组成的数组 nums 你可以对数组的任意元素执行任意次
    七、设计算法,仅使用三次实数乘法即可完成复数a+bi和c+di相乘。算法需接收a、b、c和d为输入,分别生成实部ac-bd和虚部ad+bc。文心一言:可以使用如下算法来计算复数a+bi和c+di的积,且只需进行三次实数乘法:1.将a和b相乘,得到ab;2.将c和d相乘,得到cd;3.将ab+cd赋......
  • 斐波那契数列:2.数组
    斐波那契数列:2.数组#include<stdio.h>intfib(intm){inti;inta[100]={0,1,1};for(i=2;i<=m;i++){a[i]=a[i-1]+a[i-2];}returna[m];}intmain(){intn;scanf("%d",&n);printf("%d",fib(n));return0......
  • 33. 搜索旋转排序数组
    分析:A对于题目中定义的旋转数组,从中间一分为二。一定是被分为一个有序数组,一个旋转数组(循环数组)。B若对旋转数组再次从中间分割,会重复A的操作。对有序数组二分可看做普通二分查找一致操作。定理一:只有在顺序区间内才可以通过区间两端的数值判断target是否在其中。定理二:判......