问题背景 如果给你一个包含5000万个元素的数组,然后会有频繁区间修改操作,那什么是频繁的区间修改操作呢?比如让第1个数到第1000万个数每个数都加上1,而且这种操作时频繁的。此时你应该怎么做?很容易想到的是,从第1个数开始遍历,一直遍历到第1000万个数,然后每个数都加上1,如果这种操作很频繁的话,那这种暴力的方法在一些实时的系统中可能就拉跨了。因此,今天的主角就出现了——差分数组。算法原型
考虑这样一道题: 有一个数列,每次修改区间[Li,Ri],在所有修改操作结束后询问每个单点的值 这不是裸的线段树么。。。 没必要,真的没必要。。 你想想线段树多少代码打着烦不烦呐。。 你想想如果数据是n>=10000000 线段树岂不是T得飞起 我们定义这样一个数组D[i]=A[i]-A[i-1],
原创
2021-07-20 14:14:47
121阅读
差分数组 你有没有遇到过这种情况:需要给一个区间的数组都加或减一个数 以前我是蒟蒻所以只会用for循环 而现在有了差分数组再也不用因为这个问题被困扰了 引 对于一个数组的求和我们可以用前缀和的方法来求和 即:b[i] = a[i] + a[i-1]这样b[N]就是a数组的和 正文 与b[i] = a ...
转载
2021-07-16 10:51:00
176阅读
2评论
前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。 差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。 class Difference: def __init__(self, nums): self.nums = nums self.diff = self.
转载
2021-02-04 15:17:00
1065阅读
2评论
package Week1; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.StringTokenizer; /*N个 ...
转载
2021-08-01 18:38:00
128阅读
2评论
一维差分数组
假设给你一个数组 nums ,先对区间 [a,b] 中每个元素加 3 ,在对区间 [c,d] 每个元素减 5 …… ,这样非常频繁的区间修改,常规的做法可以一个个计算。
public void increment(int[] nums, int a, int b, int k) {
for (int index = a; index <= b; index++) {
原创
2023-06-09 13:17:10
144阅读
点赞
差分数组:差分数组的思路其实是通过差分,递推出经过部分区间修改后的原数组,例如我们要对区间进行加减操作,最终求某个区间的值举个栗子:a[ ]12345差分p[ ]11111修改区间:| [1 5] +2 | [2,3] -1| [1 3] +3 |修改后的差分p[ ]601-11修改后的a[ ]6676...
原创
2022-09-19 09:52:04
57阅读
港口(差分数组)传送门思路:因为是区间加减,所以考虑差分数组,题意变为:要求差分数组d[2],d[3]…d[n]d[2],d[3]\dots d[n]d[2],d[3]…d[n]全为0.每次区间加或减会使差分数组一个加1,一个减1,因为要用最小次数,所以每次操作最好产生有效贡献,可知当为正数或负数的差分数组变为0后,剩下我们可以用区间[1,r][1,r][1,r]加减1实现对一个差分数组加减1.因此根据贪心得到 :ans=max(∑d[i]正,∑d[i]负)ans=max(\sum d[i]_{正},
原创
2021-08-10 10:11:00
236阅读
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间。, 为避免会议冲突,同时要考虑充分利用会议源,请你计算。多少间会议室,才能满足这些会议安排。
港口(差分数组)传送门思路:因为是区间加减,所以考虑差分数组,题意变为:要求差分数组d[2],d[3]…d[n]d[2],d[3]\dots d[n]d[2],d[3]…d[n]全为0.每次区间加或减会使差分数组一个加1,一个减1,因为要用最小次数,所以每次操作最好产生有效贡献,可知当为正数或负数的差分数组变为0后,剩下我们可以用区间[1,r][1,r][1,r]加减1实现对一个差分数组加减1.因此根据贪心得到 :ans=max(∑d[i]正,∑d[i]负)ans=max(\sum d[i]_{正},
原创
2022-01-22 14:20:20
129阅读
令 a[i] = $\sum_{j:0}^{i}vDiff[i]$如果 vDiff[i1]++,则a[i1...]全部++如果vDiff[i2]--,则a[i2...]全部--。
原创
2024-06-26 15:29:59
76阅读
差分数组-区间加法、航班预定统计、拼车
原创
精选
2023-05-16 21:10:05
330阅读
# 学习一阶差分数组的实现:Python入门指南
大家好!今天我们将一起学习如何在Python中实现一阶差分数组。差分数组是一种利用差分来降低计算复杂度的数学工具,尤其在解决一些动态问题时非常重要。对于初学者来说,掌握这项技术将为你后续学习打下良好的基础。
## 整体流程
在实现一阶差分数组之前,我们先明确一下要完成的流程。以下是我们学习的步骤:
| 步骤 | 描述 |
|------|-
原创
2024-09-29 04:57:42
69阅读
详解 import java.util.Arrays; import java.util.Scanner; public class Main { /** * arr数组 [left, right] 区间每个元素加 num * @param helper * @param left * @param ...
转载
2021-10-12 09:56:00
117阅读
2评论
若区间和为k的整数倍,说明前缀和数组两个元素的差应该是k的整数倍,也即每个元素%k后,余数相同。余数相同,则表示两数之差是k的整数倍。原数组后一位元素 - 前一位元素,得到的就是差分数组。通过差分数组求前缀和,可以得到原数组。对差分数组求前缀和,也可以得到原数组。对前缀和求差分数组,可以得到原数组。
原创
2023-09-29 22:08:05
67阅读
前缀和数组 前缀和:新建一数组B,数组中每一项B[i]保存A中[0…i]的和; sum[i] = a[1] + a[2] + ... + a[i]; 前缀和相邻两数之差sum[i]-sum[i-1]是原数组a[i] sum[i]-sum[i-1] = a[i]; 原数组a的某个区间[l, r]内的累 ...
转载
2021-08-31 21:00:00
223阅读
2评论
坚持写博客是一个好习惯,日日精进。20210831每日一题(get到差分法)1109. 航班预订统计1.暴力解法(面试官可能会挂人) leetcoder 在评论区评论 这道题面试官给他30分钟,他3分钟写出暴力解法,直接被挂掉。class Solution { public int[] corpFlightBookings(int[][] bookings, int n) { int len = bookings.length; int[] dp .
原创
2022-01-13 13:52:59
476阅读
前缀和:求某个区间的累加和 要求i->j区间的累加和:先求出前缀和(前缀和的第一个位置为0),第j+1个位置的元素 - 第i个位置的元素 = i->j区间的累加和 前缀和:arr = [1,2,3,4,5] preSum = [0,1,3,6,10,15] 差分数组:将某个区间的全部元素以O(1)的 ...
转载
2021-09-08 21:19:00
185阅读
2评论
减成一(差分数组)传送门思路:差分数组,目标差分数组为d[1]=1,d[2]=d[3]⋯=d[n]=0d[1]=1,d[2]=d[3]\dots=d[n]=0d[1]=1,d[2]=d[3]⋯=d[n]=0。能进行区间减操作,且保证开始数ai≥1a_i\geq1ai≥1.说明差分数组之和为正,这说明差分为正的和大于差分为负的绝对值。即取正数的差分和+d[1]d[1]d[1]与1的差值即可。#include<bits/stdc++.h>using namespace std;typ
原创
2022-01-22 14:05:01
96阅读
问题描述有编号为0到M 的(M+1)个格子,现在有N个操作 (x,y),表示将从x 到 y的格子染色
原创
2020-03-21 23:23:58
119阅读