首页 > 其他分享 >差分数组

差分数组

时间:2024-03-28 19:11:54浏览次数:27  
标签:int 差分 bookings ret 数组 diff sizeof

定义

对于数组 A[n],它的差分数组为:

\[diff[i]=\begin{cases} A[i],&i==0 \\ A[i]-A[i-1],&0<i<n \end{cases}\]

显然,通过差分数组 diff[n],可以求得 A[n] 中的某一具体元素:

\[A[i]=\begin{cases} diff[i],&i==0 \\ diff[i]+A[i-1],&0<i<n \end{cases}\]


应用

  1. 数组 A[n] 从下标 j 开始的元素,都增加 v。(即 A[j, j+1, ..., n-1] += v)

\[diff[j]=diff[j]+v \]

  1. 数组 A[n] 在区间 [L, R] 内的元素,都增加 v。(即 A[L, L+1, ..., R] += v)

\[\begin{cases} diff[L]=diff[L]+v \\ diff[R+1]=diff[R+1]-v \end{cases}\]

  1. 数组 A[n] 中的某一元素 A[j] 增加 v

\[\begin{cases} diff[j] = diff[j]+v \\ diff[j+1]=diff[j+1]-v \end{cases}\]


例题

LeetCode1109. 航班预订统计
暴力解

int* corpFlightBookings(int** bookings, int bookingsSize, int* bookingsColSize, int n, int* returnSize) {
    int *ret = (int*)calloc(n, sizeof(int));
    memset(ret, 0, n * sizeof(int));

    for (int i = 0; i < bookingsSize; i++)
    {
        for (int j = bookings[i][0] - 1; j < bookings[i][1]; j++)
        {
            ret[j] += bookings[i][2];
        }
    }
    *returnSize = n;

    return ret;
}

差分数组

int* corpFlightBookings(int** bookings, int bookingsSize, int* bookingsColSize, int n, int* returnSize) {
    int *ret = (int*)calloc(n, sizeof(int)), *diff = (int*)calloc(n, sizeof(int));
    memset(ret, 0, n * sizeof(int));
    memset(diff, 0, n * sizeof(int));
    *returnSize = n;

    for (int i = 0; i < bookingsSize; i++)
    {
        diff[bookings[i][0] - 1] += bookings[i][2];
        if (bookings[i][1] < n)
            diff[bookings[i][1]] -= bookings[i][2];
    }
    ret[0] = diff[0];
    for (int i = 1; i < n; i++)
        ret[i] = diff[i] + ret[i - 1];

    return ret;
}

标签:int,差分,bookings,ret,数组,diff,sizeof
From: https://www.cnblogs.com/hoyd/p/18102435

相关文章

  • 补|(52/60)最长递增子序列、最长连续递增序列、最长重复子数组
    子序列问题最长递增子序列leetcode:300.最长递增子序列动态规划代码实现/*以nums[i]结尾的(含)递增子序列最长为dp[i]dp[i]由dp[0~i-1]的最大值推出if(nums[i]>nums[j])dp[i]=max(dp[i],dp[j]+1);//如果严格递增dp[0]=1;其余为0正序遍历*/classSol......
  • 03-JavaScript数组
    1.数组(重点)思考:如何保存一个班级的所有学生的姓名?回答:一种方法利用前面学习过的知识,则每一条信息都需要一个变量去保存,缺点是这样做很麻烦,而且容易出错,又不合理;另一种方法就是利用数组。概念:数组是存储一系列值的变量集合,可以存储多个值。1.1语法数组构成:数组由一个或......
  • Leetcode 【930. 和相同的二元子数组】【统计「优美子数组」】【974. 和可被 K 整除的
    这道题目是经典的求子数组之和=goal的个数,用map维护。但是笔者在实现的过程中发现0的情况不是很好出来,问题在于mp[sum]和sum+=num的代码语句存在位置问题。后来看了下代码还是自己没有考虑清楚。这种类型的题目就是要想清楚你的做法,以及边界条件。classSolution{public:......
  • JavaScript变量/数组
    变量1、var:全局变量(作用域范围大,且允许重复声明)2、let:局部变量(作用域仅在代码块内,且不允许重复声明)3、const:常量(一旦声明,常量的值不能改变)数组特点:长度可变,类型可变for和foreach的区别:1、for遍历数组中的所有元素2、foreach遍历数组中有值的元素,并调用一次传入的函......
  • 力扣由浅至深 每日一题.16 ​ 合并两个有序数组​
    日复一日的生活里也会有新的快乐                 ——24.3.27合并两个有序数组给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2......
  • 【剑指offer】73. 数组中只出现一次的两个数字(超详解)
    题目链接acwingleetcode题目描述给你一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。输入:nums=[1,2,......
  • 2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数组 strs 和两个整数 m 和 n
    2024-03-27:用go语言,多维费用背包。给你一个二进制字符串数组strs和两个整数m和n,请你找出并返回strs的最大子集的长度,该子集中最多有m个0和n个1。如果x的所有元素也是y的元素,集合x是集合y的子集。输入:strs=["10","0001","111001","1","0"],m=......
  • 栈结构-数组形式
    栈是一种"后进先出(LIFO)"的线性结构,特点是只有一个出口.对于新增或者待删除的元素都保存在栈的同一端,成为"栈顶".另一端则就是"栈底"了.新加的元素靠近栈顶,旧元素靠近栈顶.就好比一口深井管道,上面的出口是栈顶,底部是栈底.先掉下来兄弟,沉得愈深,后掉......
  • 对数组方法reduce和map的深入理解,用reduce方法实现map方法
     引言:偶然看到一道面试题,希望可以用reduce方法实现map方法,看过之后发现这是个有趣的逻辑思维题、既要对数组方法有深入理解也要有一定编程能力。一、reduce语法reduce:高阶数组方法,对数组中的所有元素应用一个函数(由你提供),将其减少为单个输出值。arr.reduce((prev,cur,ind......
  • 数组自定义unshift和去重
    arr=[1,2,4,5]arrObj=Object.assign([],arr)//自定义实现数组unshiftArray.prototype.myunshift=function(...eles){constlen=this.lengthfor(leti=1;i<=len;i++){arr[i]=arrObj[i-1]}varargs=Array.from(eles);arr[0]=......