差分数组相关知识点以及刷题

差分数组

差分数组是什么?

**举例:**对于数组考虑数组 a=[1,3,3,5,8],对其中的相邻元素两两作差(右边减左边),得到数组 [2,0,2,3]。然后在开头补上 a[0]得到差分数组:

d=[1,2,0,2,3]

如果对数组进行从左往右累加d中的元素,就对差分数组进行了还原,即还原成了数组a :

a=[1,3,3,5,8]

所以差分数组定义为:差分数组是一个数组,其中每个元素表示原始数组中相邻元素之间的差值。这种数组通常用于解决区间增量更新和查询的问题。

差分数组与前缀和相对应。差分数组通过前缀和求取原始数组,前缀和可以通过差分数组返回原始数组

差分数组怎么计算?

如果有一个原始数组 nums,差分数组 diff 的计算方式如下:

  1. 第一个元素 diff[0] 等于原始数组的第一个元素 nums[0]
  2. 对于 i > 0 的每个位置,diff[i] = nums[i] - nums[i - 1]

举例:nums = [1, 3, 2, 4, 1]的差分数组为:diff = [1, 2, -1, 2, -3]

差分数组有什么用?

通过差分数组,可以在 O(1) 时间内对原始数组的某个区间进行增量更新,而无需修改整个区间的值。对差分数组进行更新时,可以通过修改两个位置的值来实现:

  • 对于区间 [left, right] 的增量 valdiff[left] 增加 valdiff[right + 1] 减去 val
  • 举例:
    • 数组nums = [1, 3, 2, 4, 1],的差分数组为:diff = [1, 2, -1, 2, -3]
    • 对数组nums[1],nums[2],nums[3]都加上10,得到nums' = [1, 13, 12, 14, 1]
    • 对数组进行作差,并在开头补上nums'[0]=nums[0],得到差分数组:diff' = [1, 12, -1, 2, -13]
    • 对比两个差分数组diff = [1, 2, -1, 2, -3],diff' = [1, 12, -1, 2, -13]可以发现,只有diff[1]diff[4]发生了变化,这意味着对 nums数组的操作,可以转变成对差分数组 diff的两个数操作。

这种方式在处理大规模数组的增量操作时非常高效,因为它只需要修改差分数组的少数几个元素,然后再根据差分数组重新构建原始数组。

差分数组的性质

性质 1:从左到右累加 diff*中的元素可以得到数组 nums

性质2: 以下两种操作是等价的:

  • 把 nums的子数组nums[i], nums[i+1], …, nums[j]都加上x`。
  • - 把 diff[i] 增加 x,把 d[j+1] 减少 x

性质3: 如果nums数组全为0,那么差分数组diff也全为0

利用性质 2,我们只需要 O(1) 的时间就可以完成对 nums 的子数组的操作。最后利用性质 1 从差分数组复原出数组 nums

Leetcode题目

1094. 拼车

题目:

题目链接:1094. 拼车

题目描述:车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向

给定整数 capacity 和一个数组 trips , trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromitoi 。这些位置是从汽车的初始位置向东的公里数。

当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false

示例 1:

输入:trips = [[2,1,5],[3,3,7]], capacity = 4
输出:false

示例 2:

输入:trips = [[2,1,5],[3,3,7]], capacity = 5
输出:true
思路:
  1. 初始化一个数组 diff,表示差分数组,用于记录各个站点的乘客数量,站点编号从 1 开始。

  2. 对于每个 trip,其中 trip[i]=(c, a, b) 表示有 c 个乘客在 a 站上车,在 b 站下车。对差分数组 nums 区间**[a,b)**,**注意是左开右闭,因为在b站点就下车了。**进行操作:

    • diff[a] += c
    • diff[b] -= c
  3. 处理完所有 trips 后,对差分数组 diff 进行前缀计算,即累加数组中的值,得到各个站点的乘客数量。

  4. 最后,将各个站点的乘客数量与给定的 capacity 比较,判断是否超载。

    注意: 人为规定站点编号从 1 开始。

代码:
class Solution {public boolean carPooling(int[][] trips, int capacity) {//差分数组:对某段区间可以实现快速的进行同一个操作,再利用前缀和进行恢复数组int ans[] = new int[1010];//计算差分数组for(int i = 0; i < trips.length; i++){int num = trips[i][0];int from = trips[i][1];int to = trips[i][2];ans[from+1] += num;ans[to+1] -= num;}//通过前缀和计算每个时间段的乘客人数for(int i = 1; i <= 1000; i++){ans[i] += ans[i-1];if(ans[i] > capacity) return false;}return true;}
}

差分数组相关题目:

航班预订统计

将区间分为最少组数

字母移位 II

使数组中的所有元素都等于零

最大化城市的最小供电站数目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【电路笔记】-串联和并联电阻

串联和并联电阻 文章目录 串联和并联电阻1、概述2、串联和并联电阻示例13、串联和并联电阻示例2 电阻器可以无限数量的串联和并联组合连接在一起&#xff0c;形成复杂的电阻电路。 1、概述 在之前的教程中&#xff0c;我们学习了如何将各个电阻器连接在一起以形成串联电阻器网…

编程和系统架构设计中性能优化等相关问题及解决方案

在编程和系统架构设计中,性能优化、大并发编程、异步补偿以及分布式事务控制等问题是经常面临的挑战。要优雅地解决这些问题。 常见的技术难题: 编程中常见的技术难题有很多,以下列举了一些常见的技术难题: 1. 性能优化:如何提高程序的执行效率,优化算法和数据结构,减少…

什么是Ros(四) - ros1和ros2的区别

参考&#xff1a;【ros/ros2】ros1和ros2的区别-要点记录_shuaixio的博客-CSDN博客

linux设置权限_setfacl_getfacl

3.2 设置权限ACL&#xff08;access control list&#xff09; 假设&#xff1a;/data所有者与所属组均为root&#xff0c;在不改变所有者的前提下&#xff0c;要求用户tom对该目录有完全访问权限&#xff08;rwx&#xff09;。只能考虑&#xff1a; 方法一&#xff1a;给/dat…

超详细实现【贪吃蛇】(1)

目录 技术要点介绍 &#x1f642;Win32 API &#x1f642;控制台程序 &#x1f387;标题 &#x1f387;大小 在Windows终端上&#xff1a; 在VS上&#xff1a; &#x1f387;坐标 &#x1f642;光标 &#x1f636;‍&#x1f32b;️GetStdHandle &#x1f636;‍&am…

基于STM32 + TIM _定时器的基本机构和工作原理详解

前言 本篇博客主要学习了解定时器的基本结构和工作原理&#xff0c;掌握定时器的驱动程序和设计。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 本次博客板子使用的是正点原子精英版&#xff0c;芯片是STM32F103ZET6,需要资料可以我拿取。 本博客内容原…

多个模版结构特征提取

HhsearchHitFeaturizer和HmmsearchHitFeaturizer类的get_templates方法返回TemplateSearchResult。TemplateSearchResult含有features&#xff08;TEMPLATE_FEATURES字典类型&#xff09;以及errors&#xff08;列表类型&#xff09; 和 warnings &#xff08;列表类型&#xf…

【PyTorch】(四)损失函数与优化器

文章目录 1. 损失函数2. 优化器 1. 损失函数 2. 优化器

[数据结构]红黑树的定义以及添加原则

红黑树是一种自平衡的二叉查找树&#xff0c;是一种常用的数据结构 1972年出现&#xff0c;在当时被称为平衡二叉B树。后来1978年被修改为如今的“红黑树” 它是一个特殊的二叉查找树&#xff0c;红黑树的每一个节点上都有储存位表示节点的颜色 每一个节点可以是红或者黑&#…

代码生成器——MyBatisX插件

MyBatisX插件 MyBatis-Plus为我们提供了强大的mapper和service模板&#xff0c;能够大大的提高开发效率。 但是在真正开发过程中&#xff0c;MyBatis-Plus并不能为我们解决所有问题&#xff0c;例如一些复杂的SQL&#xff0c;多表联查&#xff0c;我们就需要自己去编写代码和SQ…

修复 Ubuntu 2204 Wi-Fi 热点无法连接问题

修复 Ubuntu 2204 Wi-Fi 热点无法连接问题 Ubuntu 升级到 Ubuntu 22.04 之后&#xff0c; 系统自带的 Wi-Fi 热点功能就不能用了&#xff0c; 共享的热点无法连接&#xff0c; 应该是 wpa_supplicant-2.10 导致的 (https://blog.incompetent.me/2022/07/27/workaround-ubuntu-…

22.Python 操作目录

目录&#xff09; 1. 认识路径相对路径绝对路径 2. 拼接路径3.检测目录4.创建和删除目录5.遍历目录 1. 认识路径 目录也称文件夹&#xff0c;用于分层保护文件&#xff0c;通过目录可以分门别类地存放文件&#xff0c;也可以通过目录快速地找到想要的文件&#xff0c;在Python…

每天一点python——day83

#每天一点Python——83 #python报错原因 bug&#xff1a; 在计算机程序中&#xff0c;bug是指程序中的错误或故障&#xff0c;导致程序不能按照预期执行或产生不正确的结果。 这种错误可能是由编码或设计错误、运行环境不一致、输入数据异常等多种原因导致的。常见的bug类型包括…

密码学实验三

第一题&#xff1a; 寻找满足特定条件的 e&#xff1b; 第一步&#xff1a; 第二步&#xff1a; 由式1.7知&#xff0c;给定e,p,q&#xff0c;就可计算出相应的RSA不动点的数目。因此设计算法步骤如下&#xff1a; 枚举找出所有与φ(n)互素的e。枚举所有满足条件的e&#xff…

oracle 去重

Oracle去重 在Oracle中进行去重的SQL语句有以下几种&#xff1a; 1.使用DISTINCT关键字 使用SELECT DISTINCT列名 FROM 表名来选择唯一的值。例如&#xff1a;SELECT DISTINCT column_name FROM table_name; 2.使用GROUP BY子句 使用GROUP BY子句将重复的值分组&#xff0…

为XiunoBBS4.0开启redis缓存且支持密码验证

修改模块文件1 xiunoPHP/cache_redis.class.php: <?phpclass cache_redis {public $conf array();public $link NULL;public $cachepre ;public $errno 0;public $errstr ;public function __construct($conf array()) {if(!extension_loaded(Redis)) {return $thi…

HTTP 基本概念(计算机网络)

一、HTTP 是什么&#xff1f; HTTP(HyperText Transfer Protocol) &#xff1a;超文本传输协议。 HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。 「HTTP 是用于从互联网服务器传输超文本到本地浏览器的协议…

Linux部分基础指令讲解

目录 1.echo指令 2.more指令 3.less指令&#xff08;重要&#xff09; 4.head指令 5.tail指令 6.管道| 7.时间相关的指令 8.cal指令 9.find指令 10.grep指令 1.echo指令 我们先看效果 如图所示我们可以看到显示器显示出了hellow world和hellow这两句话&#xff0c;我们的echo的…

51单片机对SHT30的驱动,读取温湿度

一、SHT30简介 SHT30温湿度传感器是一种数字式温湿度传感器&#xff0c;由Sensirion公司开发和生产。它具有高精度、快速响应和稳定性强的特点&#xff0c;被广泛用于气象观测、室内环境监测、智能家居和工业自动化等领域。 以下是SHT30温湿度传感器的主要特点&#xff1a; 高精…

简单句子成分、阅读技巧

四、段落的主旨题&#xff1a;问这一段讲了什么&#xff08;一般都在段落的第一句话或最后一句话&#xff09; 词汇题的答案一般都在生词的上一句或者下一句 做题步骤&#xff1a; 1、先标段落 2、看题&#xff0c;划出关键词 3、去原文定位&#xff0c;标注中文意思 4、第一遍…