数组(三)-- LeetCode[370][1109][1094] 区间加法

news2024/9/24 5:52:18

1 区间加法

1.1 题目描述

1.2 求解思路

        常规的思路很容易,给区间 nums[i: j] 加上 val,那就⼀个 for 循环给它们都加上呗,但这种思路的时间复杂度是 O ( N ) O(N) O(N),由于这个场景下对 nums 的修改⾮常频繁,所以效率会很低下。

        这⾥就需要差分数组的技巧,差分数组是与前缀和数组所对应的一种逆操作,类似于求导和积分,也就是说,对差分数组求前缀和,可以得到原数组,同样的,对前缀和数组求差分,也可以得到原数组。

        差分数组的性质是:当我们希望对原数组的某一个区间[i, j]施加一个增量 inc 时,差分数组d对应的变化是:d[i]增加inc,d[j+1]减少inc,并且这种操作是可以叠加的。

        下面举个例子:

        差分数组是一个辅助数组,从侧面来表示给定某一数组的变化,一般用来对数组进行区间修改的操作。

        还是上面那个表里的例子,我们需要进行以下操作:

         1. 将区间[1,4]的数值全部加上3
         2. 将区间[3,5]的数值全部减去5

        很简单对吧,你可以进行枚举。但是如果给你的数据量是1e5,操作量1e5,限时1000ms你暴力枚举能莽的过去吗?慢到你怀疑人生直接。这时我们就需要使用到差分数组了。

        其实当你将原始数组中元素同时加上或者减掉某个数,那么他们的差分数组其实是不会变化的。

        利用这个思想,咱们将区间缩小,缩小的例子中的区间 [1,4] 吧这是你会发现只有 d[1] 和 d[5] 发生了变化,而 d[2], d[3], d[4]却保持着原样,

        进行下一个操作,

        这时我们就会发现这样一个规律,当对一个区间进行增减某个值的时候,他的差分数组对应的区间左端点的值会同步变化,而他的右端点的后一个值则会相反地变化,其实这个很好理解。

        本部分参考自:差分详解+例题

        也就是说,当我们需要对原数组的不同区间施加不同的增量,我们只要按规则修改差分数组即可。所以,差分数组的主要适⽤场景是频繁对原始数组的某个区间的元素进⾏增减,但只能是区间元素同时增加或减少相同的数的情况才能用。

代码实现:

class Solution:
    def getModifiedArray(self, length: int, updates: List[List[int]]) -> List[int]:
        diff = [0] * (length+1)  # 末尾多个0,防止越界
        
        for update in updates:
            start, end, inc = update[0], update[1], update[2]
            diff[start] += inc
            diff[end + 1] -= inc
        
        for i in range(1, length):
            diff[i] += diff[i - 1]            # 对差分数组求前缀和便可得到原数组
            
        return diff[:-1]

2 航班预订统计

2.1 题目描述

        题目链接:https://leetcode.cn/problems/corporate-flight-bookings/

2.2 代码实现

        题⽬说的 n 是从 1 开始计数的,⽽数组索引从 0 开始,在构造差分数组时,需要相应的调整数组下标对应关系,这里在前面添加0,和三元组 (i, j, k) 依次对应。

class Solution:
    def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:
        diff = [0] * (n+1)
        for booking in bookings:
            start, end, inc = booking[0], booking[1], booking[2]
            diff[start] += inc
            if end < n:             # 没在末尾添加0,要判断一下边界
                diff[end+1] -= inc
        for i in range(1, n+1):
            diff[i] += diff[i-1]
        return diff[1:]

复杂度分析

  • 时间复杂度: O ( n + m ) O(n+m) O(n+m),其中 n n n 为要求的数组长度, m m m 为预定记录的数量。我们需要对于每一条预定记录处理一次差分数组,并最后对差分数组求前缀和。
  • 空间复杂度: O ( 1 ) O(1) O(1)

3 拼车

3.1 题目描述

        题目链接:https://leetcode.cn/problems/car-pooling/

3.2 思路分析

  1. 首先大致可以看出这也是数组子区间增减问题,使用数组画出来看一下,是否能用差分数组

  2. 定义数组保存每一站车上人数,接客是对子区间全部元素加 n 运算,多次上下车后,看最终数组每一站人数是否超过capacity,超过则说明有乘客上不来

  3. 注意:

  • 接人影响的子区间为[start, end-1],因为这批乘客在下车站已经下车了
  • 0 <= trips[i][1] < trips[i][2] <= 1000,可以看出trips中start/end就是数组下标,这里可以直接定义差分数组大小,也可以使用循环找到最多有几站

        以trips = [[2,1,5],[3,3,7]], capacity = 4为例,数组变化:

  1. 说明:
  • 数组长度为8,表示全程 0~7 共8个站点,元素值表示在第i站车上人数
  • 没有接人时为原数组,接人是对数组的修改
  • 最后看每站人数是否超过capacity
  • 因为3/4站人数超过capacity,说明到第3站有乘客上不来
  1. 观察上面数组变化,可以看出是子区间内元素全部加 n,多次修改后求修改后数组的问题——典型的差分数组求解,对应差分数组变化:
class Solution:
    def carPooling(self, trips: List[List[int]], capacity: int) -> bool:
        diff = [0] * (1001)      # 题目中最多有1001个车站
        max_station = 0          # 找到车站数
        for trip in trips:
            inc, start, end = trip[0], trip[1], trip[2]
            diff[start] += inc
            diff[end] -= inc      # 第end站乘客已经下车,这里就不用end+1
            max_station = max(max_station, end)
        for i in range(1, max_station+1): # 进行区间求和
            diff[i] += diff[i-1]
        if max(diff[:max_station]) > capacity:
            return False
        return True

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

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

相关文章

【Redis】常见命令介绍(二)

&#x1f697;Redis学习第二站~ &#x1f6a9;起始站&#xff1a;【Redis】概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 &#x1f44d;希望您能有所收获 一.概述 Redis是典型的key-value数据库&#xff0c;key一般是字符串&#xff0c;而…

电子科技大学软件工程期末复习笔记(八):软件维护

目录 前言 重点一览 软件维护的定义 四种类型的维护 软件维护的必要性 软件维护的成本 软件维护的困难性 可维护性的定义 决定软件可维护性的因素 软件维护的过程模型 维护费用估算 软件再工程 软件逆向工程 本章小结 前言 本复习笔记基于王玉林老师的课堂PPT与…

微信小程序开发【贰】

随手拍拍&#x1f481;‍♂️&#x1f4f7; 日期: 2023.01.28 地点: 台州 介绍: 吃完午饭后走在门前的步行道上&#xff0c;恰逢疫情高峰&#xff0c;整条步行道上只有我一个人&#xff0c;旁边的河面上时而掠过几只水鸟&#xff0c;试图打破这宁静的画面。墙上的涂鸦见证了疫情…

华为OD机试题,用 Java 解【人数最多的站点】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

华为OD机试题,用 Java 解【最小传递延迟】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

Java-扑克牌的创建以及发放

Java-扑克牌的创建以及发放题目&#xff1a;创建一个扑克牌(不需要包含大小王)&#xff0c;分别分发给3个人&#xff0c;一个人发5张牌&#xff0c;输出结果要求包含全套牌(52张牌)&#xff0c;以及3个人各自的牌的花色以及数字。1.扑克牌的源代码2.扑克牌运行结果3.扑克牌代码…

一种多场景通用备份容灾方案

导购链路中&#xff0c;因为业务对SLA的要求和下游无法保持一致&#xff0c;导致很多业务场景需要使用备份容灾。如当业务依赖的下游偶现异常或者超时的情况&#xff0c;在下游无法提供强依赖的数据时&#xff0c;为保证不空窗且当前业务对数据实时性要求不高时&#xff0c;可以…

【数据结构】单链表的C语言实现--万字详解介绍

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.链表1.1 链表的概念…

基于MSAM-YOLOv5的内河航道船舶识别方法

摘 要 针对内河航道上无人船识别目标时受背景复杂性和分布多样性影响而存在漏检的问题&#xff0c;提出了一种基于YOLOv5(you only look once)的算法。首先&#xff0c;提出了一种注意力模块MSAM(multiscale attention module&#xff0c;多尺度注意力模块)&#xff0c;MSA…

【新型密集采样网络:遥感超分】

Remote Sensing Image Super-Resolution Using Novel Dense-Sampling Networks &#xff08;基于新型密集采样网络的遥感图像超分辨率&#xff09; 超分辨率技术在提高遥感数据的空间分辨率、克服星载成像系统的物理限制等方面发挥着重要作用。基于卷积神经网络&#xff08;C…

可视化技术第一节课

主要内容通过echarts实现在网页上显示图表实现不同类型图表的转换实际操作&#xff08;1&#xff09;安装echarts如果想要安装echarts可以参考&#xff1a;安装步骤当然我们可以直接在我们的代码里面添加连接直接引用<script src"http://cdn.bootcss.com/echarts/4.8.0…

buu [BJDCTF2020]rsa_output 1 SameMod 1

[BJDCTF2020]rsa_output 1&#xff1a; 题目描述&#xff1a; {210583393373542878475341075446136053050154410905089240941988166912191033995268001128024163830889952539088574602667269256158268953033778016148293640346244751958599979431463055883159391307774504851…

2.27日报

情报上传接口添加字段&#xff1a;问题分配 调试手机号登录接口 解决困惑已久的bug&#xff1a;解析不到token; 问题描述&#xff1a; 在局域网下&#xff0c;前端页面请求时在请求头里携带token信息&#xff0c;后台获取不到header里的token参数&#xff0c;但是使用postma…

阶段八:服务框架高级(第六章:ElasticSearch3)

阶段八&#xff1a;服务框架高级&#xff08;第六章&#xff1a;ElasticSearch3&#xff09;Day-第六章&#xff1a;ElasticSearch分布式搜索引擎30.学习目标1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法&#xff08;桶聚合&#xff09;1.2.2.聚合结果排序1.2…

软件测试面试题 —— 整理与解析(2)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;&#x1f30e;【Austin_zhai】&#x1f30f; &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xf…

python学生信息管理系统

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;python学生信息 免费获取完整源码源文件配置教程说明等 在IDLE中运行《学生信息管理系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&#xff0c;有两种方…

SpringBoot2入门 第一个HelloWorld(参考尚硅谷SpringBoot2零基础入门教程)

文章目录0 官方文档1 系统要求2 maven设置3 HelloWorld3.0 需求3.1 创建Maven工程3.2 引入依赖3.3 创建主程序3.4 编写业务3.5 测试3.6 简化配置3.7 简化部署0 官方文档 https://docs.spring.io/spring-boot/docs/2.3.4.RELEASE/reference/html/index.html 1 系统要求 想要运…

RFS自动化测试工具安装与使用总结

一&#xff0c;调试 1&#xff0c;在调试时&#xff0c;总时提示“无法打开浏览器” 解决办法&#xff1a; 1&#xff0c;把浏览器的代理关闭 2&#xff0c;把浏览器的显示比例调到100% 3&#xff0c;在IE设置的安全选项中&#xff0c;把启用保护模式开启 4&#xff0c;去除进…

layui框架学习(12:进度条)

进度条是应用系统中的常见元素&#xff0c;无论是上传文件、下载文件、加载内容时都会显示进度条&#xff0c;Layui支持设置线条形进度条的样式&#xff0c;同时支持通过element模块动态操作进度条。   进度条样式分为两级结构&#xff0c;顶层一般为div元素&#xff0c;其cl…

【Opencv项目实战】背景替换:动态背景移除与替换(cvzone)

文章目录一、项目思路二、环境布置2.1、cvzone安装2.2、MediaPipe安装2.3、常见问题2.4、注意事项三、算法详解3.1、segmentor.removeBG()&#xff1a;去除背景&#xff08;抠出图像中的人&#xff09;3.2、cvzone.stackImages()&#xff1a;堆叠图像3.3、fpsReader.update()&a…