【LeetCode每日一题】1109. 航班预订统计1094. 拼车 (差分数组)

news2024/11/23 8:30:22

差分数组

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

一、基本概念:

差分数组的定义如下:

假设原始数组为arr,差分数组为diff,其中diff[i] = arr[i] - arr[i-1](0 < i < n)。

根据差分数组的定义,可以通过对差分数组进行累加操作来还原出原始数组:

arr[0] = diff[0]
arr[1] = diff[0] + diff[1]
arr[2] = diff[0] + diff[1] + diff[2]
...
arr[i] = diff[0] + diff[1] + ... + diff[i]

差分数组的主要优势在于,通过对差分数组进行区间修改操作,可以在O(1)的时间复杂度内完成。例如,如果要将原始数组的某个区间[l, r]中的每个元素都增加一个常数val,可以通过修改差分数组来实现:

diff[l] += val
diff[r+1] -= val

通过修改差分数组后,只需要对差分数组进行一次累加操作即可还原出修改后的原始数组。

在这里插入图片描述

二、真题练习

1109. 航班预订统计

https://leetcode.cn/problems/corporate-flight-bookings/

这里有 n 个航班,它们分别从 1n 进行编号。

有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firstilasti包含 firstilasti )的 每个航班 上预订了 seatsi 个座位。

请你返回一个长度为 n 的数组 answer,里面的元素是每个航班预定的座位总数。

示例 1:

输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
输出:[10,55,45,25,25]
解释:
航班编号        1   2   3   4   5
预订记录 1 :   10  10
预订记录 2 :       20  20
预订记录 3 :       25  25  25  25
总座位数:      10  55  45  25  25
因此,answer = [10,55,45,25,25]

题目转化:

原数组是全0 数组,在 [1,2] 区间同时加上10… 求操作后的数组。

思路:

  • 构造差分数组
  • 对差分数组进行操作
  • 将差分数组还原成结果数组。

注意点

  • 区间是闭合的,[first,last] 都是有预定的。

  • 因为编号是从1 开始的,因此是

    diff[first-1]+=seat;
    diff[last-1+1]-=seat;
    

    last可能溢出,因此diff 数组应该长度为last+1,用diff还原的时候需要将最后一位剔除。

/**
 * @param {number[][]} bookings
 * @param {number} n
 * @return {number[]}
 */
var corpFlightBookings = function(bookings, n) {
    let diff = new Array(n+1).fill(0);
    for(let i=0;i<bookings.length;i++){
        const [first,last,seat]=bookings[i];
        diff[first-1]+=seat;
        diff[last]-=seat;
    }
    let res =[diff[0]];
    for(let i=1;i<diff.length-1;i++){
        res.push(res[i-1]+diff[i]);
    }
    return res;
}

1094. 拼车

https://leetcode.cn/problems/car-pooling/description/

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

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

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

示例 1:

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

题目转化:

原数组是全0 数组,在 [1,5) 区间同时加上2… 求操作后的数组。

思路:

  • 构造差分数组
  • 对差分数组进行操作
  • 将差分数组还原成结果数组的过程中计算是否大于capacity

注意点:

是开区间。

编号从0开始

/**
 * @param {number[][]} trips
 * @param {number} capacity
 * @return {boolean}
 */
var carPooling = function(trips, capacity) {

    // 由于最大值是1000

    let diff = new Array(1001).fill(0);
    for(let i = 0; i < trips.length; i++){
        const [num,from,to] = trips[i];
        diff[from] += num;
        diff[to] -= num; //开区间
    }

    // 不必还原,累加起来的最大数如果小于capacity就满足条件
    let sum = 0;
    for(let i = 0; i < diff.length; i++){
        sum+=diff[i];
        if(sum > capacity){
            return false;
        }
    }
    return true;
}

优化:

有可能出现超载的点都是上车或下车的点,即端点,因此只需要用map保存端点值即可。

var carPooling = function(trips, capacity) {
    let diffMap = new Map();
    for(let i = 0; i < trips.length; i++){
        const [num,from,to] = trips[i];
        if(!diffMap.has(from)){
            diffMap.set(from,0);
        }
        if(!diffMap.has(to)){
            diffMap.set(to,0);
        }
        diffMap.set(from,diffMap.get(from) + num);
        diffMap.set(to,diffMap.get(to) - num);
    }

    // 对diffMap 根据from进行排序

    let sortedDiffMap = new Map([...diffMap.entries()].sort((a,b) => a[0] - b[0]));

    let sum = 0;
    for(const [key,value] of sortedDiffMap){
        sum += value;
        if(sum > capacity){
            return false;
        }
    }
    return true;
}

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

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

相关文章

机器学习 | 掌握逻辑回归在实践中的应用

目录 初识逻辑回归 逻辑回归实操 分类评估方法 初识逻辑回归 逻辑回归&#xff08;LogisticRegression&#xff09;是机器学习中的一种分类模型&#xff0c;逻辑回归是一种分类算法&#xff0c;虽然名字中带有回归&#xff0c;但是它与回归之间有一定的联系。由于算法的简单…

搭建网站详细教程

一.领取一个免费域名和SSL证书&&CDN 特点&#xff1a;支持Cloudflare CDN Cloudflare是全球知名的CDN提供商&#xff0c;如果你不想暴露你的源站&#xff0c;又想使用我们的二级域名&#xff0c;不需要前往Cloudflare添加域名&#xff0c;修改NS记录&#xff0c;现在…

Redux状态管理(运行机制及实例)

背景&#xff1a; JavaScript需要管理的状态越来越多&#xff0c;越来越复杂;这些状态包括服务器返回的数据、缓存数据、用户操作产生的数据等等&#xff0c;也包括一些UI的状态&#xff0c;比如某些元素是否被选中&#xff0c;是否显示加载动效&#xff0c;当前分页。 状态之…

prometheus的alertmanager监控报警

监控告警&#xff1a; alert是一个单独的模块&#xff0c;需要我们单独的配置。 需要声明一个邮箱地址。配置是以configmap进行部署。 alert 实验&#xff1a; vim alert-cfg.yaml apiVersion: v1 kind: ConfigMap metadata:name: alertmanagernamespace: monitor-sa data…

【Spring Boot 源码学习】BootstrapRegistry 详解

《Spring Boot 源码学习系列》 BootstrapRegistry 详解 一、引言二、往期内容三、主要内容3.1 源码初识3.2 register 方法3.3 registerIfAbsent 方法3.4 isRegistered 方法3.5 getRegisteredInstanceSupplier 方法3.6 addCloseListener 方法3.7 InstanceSupplier 内部接口类3.7…

༺༽༾ཊ—Unity之-01-工厂方法模式—ཏ༿༼༻

首先创建一个项目&#xff0c; 在这个初始界面我们需要做一些准备工作&#xff0c; 建基础通用文件夹&#xff0c; 创建一个Plane 重置后 缩放100倍 加一个颜色&#xff0c; 任务&#xff1a;使用工厂方法模式 创建 飞船模型&#xff0c; 首先资源商店下载飞船模型&#xff0c…

2024-01-06-AI 大模型全栈工程师 - 机器学习基础

摘要 2024-01-06 阴 杭州 晴 本节简介: a. 数学模型&算法名词相关概念; b. 学会数学建模相关知识&#xff1b; c. 学会自我思考&#xff0c;提升认知&#xff0c;不要只会模仿&#xff1b; 课程内容 1. Fine-Tuning 有什么作用&#xff1f; a. 什么是模型训练&#xff…

springboot144基于mvc的高校办公室行政事务管理系统设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

VMware虚拟机安装统信uos桌面专业版操作系统系统

统信uos桌面版版本对比:https://www.uniontech.com/next/product/desktop-contrast专业版只要是面向政企等单位,这里只是用虚拟机安装测试基本功能使用,对于我们个人要长期使用的话可以使用家庭版或者社区版 1镜像下载 1.1打开官网 镜像在统信生态社区下载统信生态社区官网:…

C#,洛布数(Lobb Number)的计算方法与源代码

1 洛布数&#xff08;Lobb Number&#xff09; 在组合数学中&#xff0c;洛布数&#xff08;Lobb Number&#xff09;L(m&#xff0c;n)计算nm开括号的排列方式&#xff0c;以形成一个有效的平衡括号序列的开始。 Lobb数由两个非负整数m和n参数化&#xff0c;其中n>m>0。…

【金蝶BI方案】用一张报表,分析生产完成情况

当老板问生产完成地怎样&#xff1f;难道还能拿出一叠报表让老板逐个细看&#xff1f;奥威-金蝶BI方案只用一张BI数据可视化报表就把整个生产完成情况给讲明白了。甚至还能满足老板想从不同角度进行分析的需求。 奥威-金蝶BI方案-BI生产完成情况报表 这张报表总结计算了生产合…

微软新的内部开发部门发现了第一个 Windows 12 版本

Windows 11 被证明让很多人有点失望&#xff0c;很多 Windows 10 用户认为没有理由升级。 这意味着有大量用户渴望一些大而令人印象深刻的东西——而这正是 Windows 12 所希望的。 无论您是 Windows 10 的忠实拥趸&#xff0c;还是渴望更新、更闪亮的 Windows 11 采用者&#x…

工具方法 - 找富婆包养的必胜法则

【标准的问题解决方法&#xff0c;以及作业标准与标准作业】 第一步: 明确问题 你的人生轨迹是&#xff1a; 你要解决的问题是&#xff0c;找到自己的爱人。 而立之年&#xff0c;恋爱结婚已成为一大任务&#xff01; 第二步&#xff1a;了解现状 我们在做计划之前必须进行一…

vit细粒度图像分类(七)TBNet学习笔记

1.摘要 细粒度鸟类图像识别致力于实现鸟类图像的准确分类&#xff0c;是机器人视觉跟踪中的一项基础性工作。鉴于濒危鸟类的监测和保护对保护濒危鸟类具有重要意义&#xff0c;需要采用自动化方法来促进鸟类的监测。在这项工作中&#xff0c;我们提出了一种新的基于机器人视觉…

Qt读写Execl:QXlsx库

Qt三方库开发技术&#xff1a;QXlsx介绍、编译和使用 我自己记录的实例代码&#xff1a;https://download.csdn.net/download/cao_jie_xin/88795216 目录 一、概述二、下载三、编译四、加载QXlsx静态库五、介绍一些常用的功能1、一些头文件和命名空间2、创建一个excel文件3、…

二进制安全虚拟机Protostar靶场(5)堆的简单介绍以及实战 heap0

前言 这是一个系列文章&#xff0c;之前已经介绍过一些二进制安全的基础知识&#xff0c;这里就不过多重复提及&#xff0c;不熟悉的同学可以去看看我之前写的文章 什么是堆 堆是动态内存分配的区域&#xff0c;程序在运行时用来分配内存。它与栈不同&#xff0c;栈用于静态…

外包干了8个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

2023安防行业十件大事,一定有你关心的

2023年对我国安防行业来说&#xff0c;可以说是既充满希望又充满不确定性的一年。经历三年的市场低迷&#xff0c;2023年安防市场开始逐渐回暖&#xff0c;行业景气度缓慢上升。 那么&#xff0c;2023年我国安防行业都发生了哪些值得铭记的大事&#xff1f;哪些事件对安防产业…

手把手教测试,全网内容最全最深-jmeter-Throughput Controller(吞吐量控制器)

5.1.6.15.Throughput Controller(吞吐量控制器) 用来控制后代组件的执行的次数。有两种模式&#xff1a;百分比和次数&#xff1b;不会影响取样器的 TPS&#xff0c;只影响执行次数。 1.按照次数执行&#xff1a; 1).勾选Per User&#xff1a; 2).不勾选Per User&#xff1a…

Skywalking trace UI页面中字段信息详解,包括端点、跨度类型和Peer

刚上手Skywalking的同学可能对 trace UI 页面信息中的字段信息不是很了解&#xff0c;在这里就给大家一一讲解&#xff0c;重点关注端点、跨度类型和Peer 服务 :服务的名称 实例&#xff1a;服务对应的实例 端点&#xff1a;端点(Endpoint) 对于特定服务所接收的请求路径, 如…