图解「差分」入门(“前缀和“ 到 “差分“ 丝滑过渡)

题目描述

这是 LeetCode 上的 「1094. 拼车」 ,难度为 「中等」

Tag : 「差分」、「前缀和」

车上最初有 capacity 个空座位,车只能向一个方向行驶(不允许掉头或改变方向)。

给定整数 capacity 和一个数组 trips, 表示第 i 次旅行有 乘客,接他们和放他们的位置分别是

这些位置是从汽车的初始位置向东的公里数。

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

示例 1:

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

输出:false

示例 2:

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

输出:true

提示:

差分

从朴素的想法开始:创建一个数组 cnt,用于存储从某个站点出发时,车上的乘客数量。

例如 含义为在站点 出发时(在该站点的下车和上车均完成),车上乘客数为 个。

对于每个 ,我们需要对 范围内的 进行加 操作。

处理完 trips 后,检查所有站点的乘客人数,根据是否满足 capacity 限制返回答案。

因此,这是一个关于「区间修改,单点查询」的经典问题,可使用「差分」求解。

所谓“差分”,是指 「原数组中每个元素与前一元素之差所形成的数组」,与之相对应的是“前缀和”。

我们知道,对原数组进行诸位累加(前缀计算操作),所得到的数组为前缀和数组。差分数组,则是对其执行前缀计算后,能够得到原数组的那个数组 🤣 。

关于「差分数组 - 原数组 - 前缀和数组」三者关系如图所示:

alt

前缀和数组的主要作用,是利用「容斥原理」快速求解某段之和。例如要查询原数组 nums 中下标范围 的和,可通过 快速求解。

差分数组的主要作用,是帮助快速修改某段区间。

由于差分数组执行「前缀计算」后得到的是原数组,因此在差分数组上修改某个值,会对原数组某段后缀产生相同的影响。

alt

因此,「当我们想要对原数组的 进行整体修改时,只需要对差分数组的 位置执行相应操作即可」

举个 🌰,假设想对原数组 nums 进行整体“加一”操作,那么可转换为对差分数组 c[l] 的加一操作(等价对原数组的 进行加一),以及对差分数组 c[r + 1] 的减一操作(等价于对原数组的 进行减一,最终只有 有加一效果)。

至此,我们完成了对「差分」的基本学习:「将原数组的区间修改等价为差分数组的特定位置修改」

回到本题,起始先用 nums 来作为差分数组,对于 ,有 个乘客在 点上车,在 点下车,因此对 进行整体加 操作,对应差分数组操作 nums[a] += c; nums[b] -= c

处理完 trips 后,对差分数组 nums 进行前缀计算(可直接复用 nums,进行原地计算),便可得到各个站点的乘客数量,与 capacity 比较得出答案。

一些细节:为了方便,人为规定站点编号从 开始。

Java 代码:

class Solution {
    public boolean carPooling(int[][] trips, int capacity) {
        int[] nums = new int[1010];
        for (int[] t : trips) {
            int c = t[0], a = t[1], b = t[2];
            nums[a + 1] += c; nums[b + 1] -= c;
        }
        for (int i = 1; i <= 1000; i++) {
            nums[i] += nums[i - 1];
            if (nums[i] > capacity) return false;
        }
        return true;
    }
}

C++ 代码:

class Solution {
public:
    bool carPooling(vector<vector<int>>& trips, int capacity) {
        vector<intnums(10100);
        for (const auto& t : trips) {
            int c = t[0], a = t[1], b = t[2];
            nums[a + 1] += c; nums[b + 1] -= c;
        }
        for (int i = 1; i <= 1000; i++) {
            nums[i] += nums[i - 1];
            if (nums[i] > capacity) return false;
        }
        return true;
    }
};

Python 代码:

class Solution:
    def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
        nums = [0] * 1010
        for t in trips:
            c, a, b = t[0], t[1], t[2]
            nums[a + 1] += c
            nums[b + 1] -= c
        for i in range(11001):
            nums[i] += nums[i - 1]
            if nums[i] > capacity: return False
        return True

TypeScript 代码:

function carPooling(trips: number[][], capacity: number): boolean {
    const nums = new Array(1010).fill(0);
    for (const t of trips) {
        const c = t[0], a = t[1], b = t[2];
        nums[a + 1] += c; nums[b + 1] -= c;
    }
    for (let i = 1; i <= 1000; i++) {
        nums[i] += nums[i - 1];
        if (nums[i] > capacity) return false;
    }
    return true;
};
  • 时间复杂度: ,其中 为数组 trips 大小; 为位置值域大小
  • 空间复杂度:

最后

这是我们「刷穿 LeetCode」系列文章的第 No.1094 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOs 4 (三) ArkTS语言

目录 一 认识ArkTs语言1.1 ArkTs1.2 基本结构 二 基本语法2.1 声明式UI2.1.1 创建组件2.1.1.1 无参数2.1.1.2 有参数2.1.1.3 组件样式2.1.1.4 组件方法2.1.1.5 组件嵌套 2.1.2 自定义组件2.1.2.1 基本结构2.1.2.2 成员函数/变量2.1.2.3 自定义组件的参数规定2.1.2.4 Build函数2…

最新版dede织梦CMS采集侠工具

在网络时代&#xff0c;拥有一个充实而有吸引力的网站是吸引访客、提高流量的关键。织梦CMS一直以其简单易用、灵活性强而备受欢迎。而如何让网站内容更富有吸引力&#xff0c;如何在激烈的网络竞争中脱颖而出&#xff1f;新版织梦采集侠以及147SEO插件或许是你的得力助手。 新…

创始人于东来:胖东来员工不想上班,请假不允许不批假!

12月2日早晨&#xff0c;一则关于“胖东来员工不想上班请假不允许不批假”的新闻登上了热搜&#xff0c;引起了广泛关注。熟悉胖东来的网友们可能知道&#xff0c;这并不是这家企业第一次成为热搜的焦点。据白鹿视频12月1日报道&#xff0c;11月25日&#xff0c;河南许昌的胖东…

水果软件FL Studio最新21.1.1.3750汉化版

FL Studio水果音乐编曲软件中文版,一款强大的音乐制作软件,可以进行音乐编曲、剪辑、录音、混音。FL Studio21.1.1.3750中文版是数字音频工作站 (DAW) 之一&#xff0c;日新月异。它是一款录音机和编辑器&#xff0c;可让您不惜一切代价制作精美的音乐作品并保存精彩的活动画廊…

Beta冲刺总结随笔

这个作业属于哪个课程软件工程A这个作业要求在哪里beta冲刺事后诸葛亮作业目标Beta冲刺总结随笔团队名称橘色肥猫团队置顶集合随笔链接Beta冲刺笔记-置顶-橘色肥猫-CSDN博客 文章目录 一、Beta冲刺完成情况二、改进计划完成情况2.1 需要改进的团队分工2.2 需要改进的工具流程 三…

vmware虚拟机怎么安装linux-rocky操作系统

vmware虚拟机安装linux-rocky操作系统 rocky下载地址&#xff1a;https://rockylinux.org/zh_CN/download/ 我下载boot版本&#xff0c;安装时候需要联网。 接下来一路下一步&#xff0c;硬盘这里可以选择“将虚拟磁盘存储为单个文件”&#xff0c;然后一直点击到完成就可以。…

在 SQL Server 中备份和恢复数据库的最佳方法

在SQL Server中&#xff0c;创建备份和执行还原操作对于确保数据完整性、灾难恢复和数据库维护至关重要。以下是备份和恢复过程的概述&#xff1a; 方法 1. 使用 SQL Server Management Studio (SSMS) 备份和还原数据库 按照 SSMS 步骤备份 SQL 数据库 打开 SSMS 并连接到您…

Python 如何判断一个数组中的任意元素是否出现在另外一个数组中

需求 数组1&#xff1a;[双十一,工业机器人,智能物流,机器人概念,智慧停车,新能源汽车,智能制造] 数组2 &#xff1a;[专用设备,电力设备,化学制药,智能物流] 代码&#xff1a; def ExistsArray(sArray, dArray):result False;for item in sArray:if item in dArray:result …

CGAL的四叉树、八叉树、正交树

四叉树&#xff08;Quadtree&#xff09;&#xff1a;四叉树是一种用于二维空间分割的数据结构。它将一个二维区域划分为四个象限&#xff0c;每个象限进一步细分为四个小块&#xff0c;以此类推。四叉树可以用于空间索引、图形学、地理信息系统&#xff08;GIS&#xff09;等领…

uniapp uview u-input在app(运行在安卓基座上)上不能动态控制type类型(显隐密码)

开发密码显隐功能时&#xff0c;在浏览器h5上功能是没问题的 <view class"login-item-input"><u-input:type"showPassWord ? password : text"style"background: #ecf0f8"placeholder"请输入密码"border"surround&quo…

MySQL- CRUD-单表查询

一、INSERT 添加 公式 INSERT INTO table_name [(column [, column...])] VALUES (value [, value...]); 示例&#xff1a; CREATE TABLE goods (id INT ,good_name VARCHAR(10),price DOUBLE ); #添加数据 INSERT INTO goods (id,good_name,price ) VALUES (20,华为手机,…

使用autodl服务器,两个3090显卡上运行, Yi-34B-Chat-int4模型,并使用vllm优化加速,显存占用42G,速度23 words/s

1&#xff0c;演示视频地址 https://www.bilibili.com/video/BV1Hu4y1L7BH/ 使用autodl服务器&#xff0c;两个3090显卡上运行&#xff0c; Yi-34B-Chat-int4模型&#xff0c;用vllm优化&#xff0c;增加 --num-gpu 2&#xff0c;速度23 words/s 2&#xff0c;使用3090显卡 和…

(11_29)畅捷通的 Serverless 探索实践之路

作者&#xff1a;计缘 畅捷通介绍 畅捷通是中国领先的小微企业财税及业务云服务提供商&#xff0c;成立于2010年。畅捷通在2021年中国小微企业云财税市场份额排名第一&#xff0c;在产品前瞻性及行业全覆盖方面领跑市场&#xff0c;位居中国小微企业云财税厂商矩阵领军象限前…

算法通关村第十四关-青铜挑战认识堆

大家好我是苏麟 , 今天带大家认识认识堆 . 堆 堆是将一组数据按照完全二叉树的存储顺序&#xff0c;将数据存储在一个一维数组中的结构。 堆有两种结构&#xff0c;一种称为大顶堆&#xff0c;一种称为小顶堆 : 大顶堆 大顶堆的任何一个父节点的值&#xff0c;都大于或等于…

道可云会展元宇宙平台全新升级,打造3D沉浸式展会新模式

随着VR虚拟现实、人工智能、虚拟数字人等元宇宙技术的快速发展&#xff0c;各个行业正试图通过元宇宙技术寻求新的发展突破口&#xff0c;会展行业也不例外。会展作为经贸领域的重要产业形态&#xff0c;越来越多的企业和组织开始寻求通过元宇宙技术为展会赋能&#xff0c;以满…

【MySQL】视图 + 用户管理

视图 前言正式开始视图用户管理user表创建新用户修改用户密码权限管理给用户赋权剥夺权限 前言 本篇所讲的视图和我上一篇事务中所讲的读视图不是一个东西&#xff0c;二者没有任何关系&#xff0c;如果看过我前一篇博客的同学不要搞混了。 其实视图和用户管理本来是想着分开…

集简云语聚AI新增模型测试,支持多模型同时进行交互,快速评估不同模型性能

语聚AI模型测试 在ChatGPT爆火的推动下&#xff0c;由生成式 AI 掀起的全球人工智能新浪潮就此拉开了序幕&#xff0c;人工智能也成为越来越多企业提升业务效率、优化业务流程的首选方案。 然而&#xff0c;面对层出不穷的AI模型&#xff0c;每个模型在完善度、功能性、易用性…

php5构造无字母数字的webshell实现任意命令执行

目录 引言 如果是在php7 如果是在php5 现在我们来上传文件 最后的结果&#xff1a; 看本篇前可以先看这一篇&#xff1a;利用异或、取反、自增bypass_webshell_waf-CSDN博客 引言 上一篇介绍了如何构造出一个无字母数字的webshell&#xff0c;但是如果后端的代码变成了这…

MIT线性代数笔记-第20讲-克拉默法则,逆矩阵,体积

目录 20.克拉默法则&#xff0c;逆矩阵&#xff0c;体积求逆公式克拉默法则用行列式关联体积 打赏 20.克拉默法则&#xff0c;逆矩阵&#xff0c;体积 求逆公式 考虑二阶方阵&#xff0c;有 [ a b c d ] − 1 1 a d − b c [ d − b − c a ] \begin{bmatrix} a & b \\ …

若依项目前后端部署记录

前言 本文较乱&#xff0c;用于笔者记录项目部署过程&#xff0c;对于想学习若依项目部署的同学看文章可能会导致误导&#xff0c;建议读者多查资料&#xff0c;保持疑问并谨慎验证。 项目官方指导&#xff1a; 环境部署 | RuoYi 1、环境部署相关 JDK > 1.8 (推荐1.8版本…