Leetcode2391. 收集垃圾的最少总时间

Every day a Leetcode

题目来源:2391. 收集垃圾的最少总时间

解法1:前缀和

收集垃圾的时间分为两部分:

  1. 垃圾车收拾垃圾的时间:垃圾车收拾一单位的任何一种垃圾都需要花费 1 分钟。
  2. 三辆垃圾车行驶的时间:每辆垃圾车都从房子 0 出发,按顺序到达每一栋房子,直到最后出现相应垃圾的房子。

算法:

  1. 初始化总时间 sum = 0,用一个 last[3] 数组分别记录三种垃圾的最后出现下标。
  2. 遍历数组 garbage,对于每一个字符串 gar,先加上收拾垃圾的时间 sum += gar.length(),再根据里面的字符更新 last 数组。
  3. 用一个 pre 数组记录 travel 的前缀和。
  4. 遍历 last 数组,每一辆垃圾车都从 0 出发,到达 last[i] 结束,加上垃圾车行驶的时间 sum += pre[last[i]] - pre[0]。
  5. 最后,sum 即为答案。

代码:

/*
 * @lc app=leetcode.cn id=2391 lang=cpp
 *
 * [2391] 收集垃圾的最少总时间
 */

// @lc code=start
class Solution
{
public:
    int garbageCollection(vector<string> &garbage, vector<int> &travel)
    {
        int n = garbage.size();
        int sum = 0;
        vector<int> last(3, -1); // m、p、g 最后出现的下标
        for (int i = 0; i < n; i++)
        {
            string gar = garbage[i];
            sum += gar.length(); // 收拾垃圾的时间
            int m = 0, p = 0, g = 0;
            for (char &c : gar)
            {
                if (c == 'M')
                    last[0] = i;
                else if (c == 'P')
                    last[1] = i;
                else
                    last[2] = i;
            }
        }
        // 路径长度前缀和
        vector<int> pre(n, 0);
        for (int i = 1; i < n; i++)
            pre[i] = pre[i - 1] + travel[i - 1];
        for (int i = 0; i < 3; i++)
            if (last[i] != -1)
                sum += pre[last[i]] - pre[0]; // 行驶的时间
        return sum;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n+L+m+k),其中 n 是数组 garbage 的元素个数,L 是数组 garbage 的字符串长度总和,m 是数组 travel 的长度,k=3 表示垃圾种类数。

空间复杂度:O(m+k),其中 m 是数组 travel 的长度,k=3 表示垃圾种类数。

解法2:一次遍历

我们可以在遍历 garbage 的同时,计算从房子 0 到房子 i 的用时 time,以及一个哈希表(或者数组)drive 记录每辆车目前的行驶用时。例如 garbage[i]=GP,那么收集 G 和 P 的垃圾车的行驶用时更新为 time,收集 M 的垃圾车的行驶用时不变。循环结束后,drive 中保存的就是每辆垃圾车各自的行驶用时了。

最后答案为所有 garbage[i] 的长度之和,加上 drive 中保存的行驶用时之和。

在遍历 garbage 的过程中把行驶时间加入答案,从而做到一次遍历。

代码:

class Solution
{
public:
    int garbageCollection(vector<string> &garbage, vector<int> &travel)
    {
        int n = garbage.size();
        int sum = garbage[0].length();
        int time = 0; // 行驶时间
        // 每辆垃圾车的行驶时间
        unordered_map<char,int> drive;
        for (int i = 1; i < n; i++)
        {
            string gar = garbage[i];
            sum += gar.length(); // 收拾垃圾的时间
            time += travel[i - 1];
            for (char &c : gar)
            {
                // 更新垃圾对应垃圾车的行驶时间
                sum += time - drive[c];
                drive[c] = time;
            }
        }
        return sum;
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n+L+k),其中 n 是数组 garbage 的元素个数,L 是数组 garbage 的字符串长度总和,k=3 表示垃圾种类数。

空间复杂度:O(m+k),其中 m 是数组 travel 的长度,k=3 表示垃圾种类数。

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

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

相关文章

windows部署腾讯tmagic-editor03-DSL 解析渲染

创建项目 将上一教程中的editor-runtime和hello-editor复制过来 概念 实现 创建hello-ui目录 渲染节点 在hello-ui下创建 Component.vue 文件 由于节点的type是由业务自行定义的&#xff0c;所以需要使用动态组件渲染&#xff0c;在vue下可以使用component组件来实现 c…

软考笔记随记

原码:(0正1负) 原码是最直观的编码方式,符号位用0表示正数,用1表示负数,其余位表示数值的大小。 例如,+7的原码为00000111,-7的原码为10000111。 原码虽然直观,但直接用于加减运算会导致计算复杂,且0有两种表示(+0和-0),不唯一。 反码: 反码是在原码的基础上得…

绘唐2跟绘唐3有什么区别

绘唐2跟绘唐3有什么区别 这款产品的最大亮点在于其高度精准的语音克隆能力&#xff0c;利用先进的模型&#xff0c;能够捕捉到用户独特的音调、音高和调制方式&#xff0c;使用户能够以前所未有的方式复制和利用自己的声音。仅需10秒钟的录制时间&#xff0c;即可实现声音的克…

【C语言】自定义类型之---结构体超详解(结构体的定义使用、指针结构体,内存对齐,......代码详解)

目录 前言&#xff1a; 一&#xff1a;结构体 1.1&#xff1a;什么是结构体&#xff1f; 1.2&#xff1a;结构体类型的声明 1.3&#xff1a;结构体变量的定义 1.4&#xff1a;结构体的内存对齐 1.5&#xff1a;结构体传参 二&#xff1a;位段 2.1&#xff1a;位段是什…

docker镜像容器常用命令

常用基础命令1、docker info #查看docker版本等信息 2、docker search jenkins #搜索jenkins镜像 3、docker history nginx #查看镜像中各层内容及大小,每层对应的dockerfile中的一条指令。 4、docker network ls #显示当前主机上的所有网络 5、docker logs nginx …

2024MySQL8安装与绿色版Navicat连接【提供安装包】数据库

视频教程面向人群和使用方法&#xff1a; 1&#xff1a;大学生【解决老师作业或自己兴趣学习需要】; 2&#xff1a;第一次需要安装MySQL的开发者【需要简单使用&#xff0c;因为项目会用到】 3&#xff1a;老手二倍速&#xff0c;新手老老实实按照教程一倍速模仿视频操作&am…

【虚拟机】深入理解java虚拟机【内存溢出实例】

目录 一、问题解析 二、粉丝福利 一、问题解析 通过简单的小例子程序&#xff0c;演示java虚拟机各部分内存溢出情况&#xff1a; (1).java堆溢出&#xff1a; Java堆用于存储实例对象&#xff0c;只要不断创建对象&#xff0c;并且保证GC Roots到对象之间有引用的可达&am…

[数据集][目标检测]卡车抓斗卸车检测数据集VOC+YOLO格式213张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;213 标注数量(xml文件个数)&#xff1a;213 标注数量(txt文件个数)&#xff1a;213 标注类别…

ROS从入门到精通4-3:制作Docker镜像文件Dockerfile

目录 0 专栏介绍1 为什么需要Dockerfile&#xff1f;2 Dockerfile书写原则3 Dockerfile常用指令3.1 FROM3.2 MAINTAINER3.3 RUN3.4 ADD3.5 COPY3.6 CMD3.7 ENV3.8 EXPOSE3.9 WORKDIR3.10 ARG 4 Dockerfile构建ROS工程实例 0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0…

数据结构与算法学习笔记一---顺序表的静态存储表示和实现(C++)

目录 前言 1.什么是顺序表 2.顺序表的静态存储表示 1.初始化 2.长度 3.数据元素 4.长度 5.获取元素下标 6.前驱节点 7.后继节点 8.插入 9.删除 10.遍历 11.测试代码 前言 这篇文章讲的是顺序表的两种实现方式。 1.什么是顺序表 线性表的顺序表示指的是用一组地址…

(论文笔记)TABDDPM:使用扩散模型对表格数据进行建模

了解diffusion model&#xff1a;什么是diffusion model? 它为什么好用&#xff1f; - 知乎 摘要 去噪扩散概率模型目前正成为许多重要数据模式生成建模的主要范式。扩散模型在计算机视觉社区中最为流行&#xff0c;最近也在其他领域引起了一些关注&#xff0c;包括语音、NLP…

LangChain搭建Agent | 使用initialize_agent

1.create_tool_calling_agent 构建agent&#xff0c;这个方法是过时了吗&#xff1f;官方文档也没更新&#xff0c;官方示例也运行错误 from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import ConfigurableField from langchain_core…

医院污水一体化处理设备有哪些

医院污水一体化处理设备通常包括以下几个主要组件&#xff1a; 预处理单元&#xff1a;用于去除污水中的固体悬浮物、颗粒物、油脂等&#xff0c;常见的预处理单元包括格栅、沉砂池、油水分离器等。生物处理单元&#xff1a;用于降解有机物质和去除氮、磷等营养物质。常见的生物…

基坑监测识别摄像机

基坑是建筑施工中的一个重要环节&#xff0c;它对整个建筑工程的安全和稳定性起着至关重要的作用。为了监测基坑的状态和确保施工的安全进行&#xff0c;基坑监测识别摄像机被广泛应用于建筑工程中。这种摄像机可以实时监测基坑施工的情况&#xff0c;识别可能存在的问题并提供…

如何在Spring启动的时候执行一些操作

如何在Spring启动的时候执行一些操作 在Spring启动的时候执行一些操作有多种方式。你可以通过实现ApplicationRunner或者CommandLineRunner接口&#xff0c;在Spring Boot应用程序启动后执行特定操作。另外&#xff0c;你也可以使用PostConstruct注解&#xff0c;在Spring Bea…

圆片/圆盘测厚设备 HW01-SG系列单点测厚仪

关键字:圆片测厚仪圆盘测厚仪, 圆形测厚仪, 单点测厚仪, 汽车工件测厚仪, 产品简介&#xff1a; 测厚仪采用上下两个对射的激光位移传感器测量圆盘状物体边缘的厚度。圆盘放置在由步进电机驱动的托盘上&#xff0c;点按测量按钮托盘旋转一周&#xff0c;可测量被测物整个圆周上…

立即注册 | 线上讲座:基于 NGINX 为现代应用构筑三大安全防线

原文作者&#xff1a;NGINX 原文链接&#xff1a;立即注册 | 线上讲座&#xff1a;基于 NGINX 为现代应用构筑三大安全防线 转载来源&#xff1a;NGINX 开源社区 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 基本信息 课程主题&#xff1a;基于 NGINX 为现代应用构…

大模型算法(零) - Transformer中的细节与实现

讲transformer的文章已经铺天盖地了&#xff0c;但是大部分都是从原理的角度出发的文章&#xff0c;原理与实现之间的这部分讲解的较少&#xff0c;想要了解实现细节&#xff0c;还是要去看代码才行。记录一下自己学习过程中遇见的细节问题和实现问题。 Transformer整体架构 图…

Android面试题之Kotlin的几种常见的类

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 初始化的顺序 主构造函数里声明的属性 类级别的属性赋值 init初始化块里的属性赋值和函数调用 次构造函数里的属性赋值和函数调用 延迟初始…

Chirpstack配合网关与lora设备通信

之前的章节讲过chirpstack的下载和安装部署&#xff0c;这节算是后续&#xff0c;利用chirpstack和lora设备做通信&#xff0c; 首先开启chirpstack&#xff0c;并登录&#xff0c;登录完成之后需要添加网关和设备&#xff0c;添加网关也就是Gatway&#xff0c;所以点开左侧的G…