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

差分数组

时间:2023-07-23 15:13:33浏览次数:30  
标签:nums int 差分 length 数组 diff

差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。

比如说,我给你输入一个数组 nums,然后又要求给区间 nums[2..6] 全部加 1,再给 nums[3..9] 全部减 3,再给 nums[0..4] 全部加 2,再给...

一通操作猛如虎,然后问你,最后 nums 数组的值是什么?

常规的思路很容易,你让我给区间 nums[i..j] 加上 val,那我就一个 for 循环给它们都加上呗,还能咋样?这种思路的时间复杂度是 O(N),由于这个场景下对 nums 的修改非常频繁,所以效率会很低下。

这里就需要差分数组的技巧,类似前缀和技巧构造的 preSum 数组,我们先对 nums 数组构造一个 diff 差分数组,diff[i] 就是 nums[i] 和 nums[i-1] 之差:

 

 

package com.wang;

public class Difference {

    // 差分数组
    private int[] diff;

    /* 输入一个初始数组,区间操作将在这个数组上进行 */
    public Difference(int[] nums) {
        assert nums.length > 0;
        diff = new int[nums.length];
        diff[0] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            diff[i] = nums[i] - nums[i - 1];
        }
    }

    public static void main(String[] args) {
        int[] a = new int[]{1, 2, 3, 4, 5, 6};
        Difference difference = new Difference(a);
        difference.increment(0, 2, 3);
        for (int i : difference.getDiff()) {
            System.out.println(i);
        }


    }

    public void increment(int i, int j, int val) {
        //根据差分数组反推原始数组时改变第一个 后面的依据前面的数据 所以改变第一个就是改变了后面所有的
        diff[i] += val;
        //如果 j在范围内就不用减去增加的了
        if (j + 1 < diff.length) {
            diff[j + 1] -= val;
        }

    }

    public int[] getDiff() {
        int[] res = new int[diff.length];
        res[0] = diff[0];
        //根据查分数组反推原始数组
        for (int i = 1; i < diff.length; i++) {
            res[i] = res[i - 1] + diff[i];
        }
        return res;
    }
}

 

标签:nums,int,差分,length,数组,diff
From: https://www.cnblogs.com/upupup-999/p/17575017.html

相关文章

  • java 判断数字是否存在数组内
    Java判断数字是否存在数组内在Java中,我们经常需要判断一个数字是否存在于一个数组中。这种情况在编程中经常会遇到,无论是查找某个元素是否存在,还是计算某个特定值的出现次数。在本文中,我们将介绍几种常见的方法来判断数字是否存在于数组内,并给出相应的代码示例。方法一:使用循环......
  • java 全局数组
    如何实现Java全局数组引言在Java中,全局数组是指在整个程序中都可以访问的数组。开发者通常需要在多个方法或类中使用同一个数组时,就可以使用全局数组。本文将介绍如何实现Java全局数组,并提供详细的步骤和代码示例。步骤下面是实现Java全局数组的步骤,我们可以通过表格来展示:......
  • java 去除数组中的空格
    Java去除数组中的空格在Java编程中,经常会遇到需要处理数组的情况。有时候我们会遇到数组中包含空格的情况,这会对我们的处理逻辑带来一定的困扰。本文将介绍如何使用Java语言去除数组中的空格,并提供代码示例供参考。为什么要去除数组中的空格数组是一种常用的数据结构,它可以存储......
  • 树状数组讲解
    1.引入给出2个问题:问题1:问题2: 数据范围:很显然,用朴素的方法去模拟会超时,那么就需要一些更优秀的数据结构——树状数组2.基本概念 给出一个数组a[8]={1,2,3,4,5,6,7,8}然后看图 在如图的一棵二叉树中,f[1]=a[1],f[3]=a[3],f[5]=a[5],f[7]=a[7]f[2]=a[1]+a[2],......
  • Unity3D 自定义类的数组初始化
    实现功能:1.自定义类,用于保存数据等2.初始化数组代码:publicclasstree_elem{//位置publicintx,y;//大小【相对于原始大小的比例】最后随机分配publicfloatsize;//树的类型,最后随机分配publictree_kindkind;publictree_ele......
  • 差分
    差分是前缀和的逆运算一维数组$diff[i]$记录了$a[i]-a[i-1]$对于区间$[l,r]$同时加$w$$Diff[1]+=w$看一道例题:Code:#include<iostream>usingnamespacestd;constintN=1e7+10;intq[N],s[N];voidinsert(intl,intr,intc){ s[l]+=c; s[r+1]......
  • jquery数组添加数据
    如何使用jQuery添加数据到数组中简介在使用jQuery开发过程中,经常会遇到需要向数组中添加数据的情况。本文将介绍如何使用jQuery实现数组的添加操作,帮助刚入行的小白快速掌握这一技巧。整体流程下面是实现"jquery数组添加数据"的整体流程,我们将使用一个表格展示每一步需要做的事......
  • jquery数组 splice
    jQuery数组splice方法详解在JavaScript编程中,数组是一种常用的数据结构,用于存储一系列的数据元素。在处理数组的时候,我们常常需要对数组进行增加、删除或修改等操作。jQuery库提供了一个非常方便的方法,即splice()方法,用于实现对数组的增删改操作。本文将详细介绍splice()方法的使......
  • Js数组
      Js数组方法  1.把数组转换为字符串:toString() join('分隔符')  2.pop() 删除数组最后一个元素  返回被删除的值  3.push() 在数组末尾添加一个元素 返回数组长度  4.shift() 删除数组首个元素 返回被删除的值  5.unshift() 在......
  • python 字符串 不在数组中
    如何判断一个字符串不在数组中引言本文将教会你如何判断一个字符串是否不在数组中。在Python中,我们可以使用循环结构和判断语句来完成这个任务。首先,我们来整理一下实现该功能的流程,然后逐步介绍每一步需要做什么,以及需要使用的代码和其注释。流程概述步骤描述步骤1......