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

news2024/9/9 4:39:42

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 表示垃圾种类数。

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

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

相关文章

24HN逆向部分wp

24H&N逆向部分wp 菜鸡新手师傅wp&#xff0c;Re 5/9&#xff0c;记录一下qaq&#xff08;好久没写博客了&#xff0c;水一篇hh&#xff09; 最喜欢的逆向题 64位&#xff0c;进主函数之后直接看&#xff0c;要求输入第5位为i&#xff0c;然后后面依次相等&#xff0c;长…

线性系统(一)

线性系统&#xff08;一&#xff09; 1.什么是线性系统2.高斯消元法3.高斯-约旦消元法4.线性方程组解的结构 链接: 线性系统&#xff08;二&#xff09; 1.什么是线性系统 线性&#xff1a;未知数只能是一次方项 非线性: 同时&#xff0c;读者也可以通过作图来更直观地感受&…

HNU-算法设计与分析-作业1

算法设计与分析 计科210X 甘晴void 202108010XXX 前言 这个系列本来想只用一个博客搞定的&#xff0c;谁曾想CSDN对于大批量文字的在线编辑一塌糊涂&#xff0c;感觉走倒车了。只能分成几个博客分别来讲了。后续会有作业-23456。作业重要的是搞懂原因。 文章目录 算法设计与…

怎么把图片改成300dpi?照片dpi调整方法

在进行印刷设计时&#xff0c;例如制作海报、宣传册、名片、杂志等&#xff0c;通常要求图片具有高分辨率&#xff0c;将图片分辨率设为300dpi可以确保图像在印刷过程中保持细节和清晰度&#xff0c;但是修改图片分辨率的方法有哪些呢?今天小编整理了几个关于改变图片分辨率的…

OpenAI王炸更新GPT-4o,具有极强的文本、图片、视频、语音混合理解能力

OpenAI刚刚发布了GPT-4o&#xff0c;这是一种新的人工智能模式&#xff0c;集合了文本、图片、视频、语音的全能模型。能够实时响应用户的需求&#xff0c;并通过语音来实时回答你&#xff0c;你可以随时打断它。还具有视觉能力&#xff0c;能识别视觉物体并根据视觉作出快速的…

使用Docker进行Jmeter分布式搭建

大家好&#xff0c;随着技术的不断发展&#xff0c;对性能测试的要求也日益提高。在这样的背景下&#xff0c;如何利用 Docker 来巧妙地搭建 Jmeter 分布式成为了关键所在。现在&#xff0c;就让我们开启这场探索之旅&#xff0c;揭开其神秘的面纱。前段时间给大家分享了关于 L…

Java ( 框架界面 , 按钮 , 动作监听ActionListener ,鼠标监听MouseListener,键盘监听KeyListener)的使用方法

package 拼图阶段任务.ui;import javax.swing.*; import java.awt.*; import java.awt.event.*;public class UseMethod {public static void main(String[] args) { // 框架的用法JFrame jf new JFrame();// 设置界面的宽高jf.setSize(603,680);// 设置界面的标题jf.setTitle…

k8s 二进制安装 详细安装步骤

目录 一 实验环境 二 操作系统初始化配置&#xff08;所有机器&#xff09; 1&#xff0c;关闭防火墙 2&#xff0c;关闭selinux 3&#xff0c;关闭swap 4, 根据规划设置主机名 5, 做域名映射 6&#xff0c;调整内核参数 7&#xff0c; 时间同步 三 部署 dock…

Git项目管理——提交项目和版本回退(二)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

嵌入式——C51版本Keil环境搭建

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 目标搭建流程下载与安装激活STC环境添加校验是否导入STC环境 目标 ● 了解C51版本Keil开发环境的概念和用途 ● 掌握C51版本Keil环…

PG Vacuum 空间管理工具与pg_freespacemap使用

1.什么是Vacuum&#xff1a; PG pageinspect使用与块空间清理学习-CSDN博客 之前说过PG块更新的特点:先删除后插入&#xff0c;但老元组并不会真正删除&#xff0c;只是把老元组标记为删除状态&#xff0c;这就导致了PG中会有大量的垃圾数据&#xff0c;update所造成的资源消…

LeetCode518:零钱兑换Ⅱ

题目描述 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号…

进程信号 signal

文章目录 信号基础信号的产生OS中的时间 信号的保存sigset_tsigprocmasksigpending 信号的捕捉用户态和内核态sigactionvolatile SIGCHLD 信号基础 生活中的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也知道快递来临…

Blog搭建:pycharm+虚拟环境+django

pycharm创建项目 在pycharm新建项目&#xff0c;选择Django 项目名称&#xff1a;自定义项目位置&#xff1a;自定义创建git&#xff1a;方便上传到github选择虚拟环境方式venvpython解释器位置&#xff0c;和版本&#xff0c;如果你没有下载他会跳转到不同版本的供你下载temp…

分布式计算、并行计算、网格计算、边缘计算

分布式计算 分布式计算是一种计算方法&#xff0c;它将一个大型的计算任务分解成多个子任务&#xff0c;并将这些子任务分布在网络上的多台计算机&#xff08;节点&#xff09;上同时执行。这些节点通过通信网络协同工作&#xff0c;共同完成任务。每个节点可以独立处理自己的…

Skywalking配置traceId

1.引言 1.1 SkyWalking概述 SkyWalking是一个开源的分布式系统观测平台&#xff0c;旨在解决微服务和云原生架构中常见的性能监控和故障排除问题。自2015年由Apache基金会孵化以来&#xff0c;SkyWalking已经成为全球范围内广泛使用的APM&#xff08;应用性能管理&#xff09…

括号生成[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 数字n代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())(…

MATLAB车辆动力学建模 ——《控制系统现代开发技术》

引言 在上这门课之前&#xff0c;我已经用过CasADi 去做过最优化的相关实践&#xff0c;其中每一步迭代主要就是由&#xff1a;对象系统优化求解两部分组成的。这里我们重点介绍 “对象系统”如何去描述 &#xff0c;因为它是每一步迭代中重要的一环——“优化求解”会获得控制…

2024生日快乐祝福HTML源码

源码介绍 2024生日快乐祝福HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c; 源码截图 源码下载 2024生日快乐祝福HTML源码

【C++】学习笔记——多态_1

文章目录 十二、继承8. 继承和组合 十三、多态1. 多态的概念2. 多态的定义和实现虚函数重写的两个特殊情况override 和 final 3. 多态的原理1. 虚函数表 未完待续 十二、继承 8. 继承和组合 我们已经知道了什么是继承&#xff0c;那组合又是什么&#xff1f;下面这种情况就是…