LeetCode 1921. Eliminate Maximum Number of Monsters【贪心,计数排序】1527

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物侵袭。给你一个 下标从 0 开始 且长度为 n 的整数数组 dist ,其中 dist[i] 是第 i 个怪物与城市的 初始距离(单位:米)。

怪物以 恒定 的速度走向城市。给你一个长度为 n 的整数数组 speed 表示每个怪物的速度,其中 speed[i] 是第 i 个怪物的速度(单位:米/分)。

怪物从 第 0 分钟 时开始移动。你有一把武器,并可以 选择 在每一分钟的开始时使用,包括第 0 分钟。但是你无法在一分钟的中间使用武器。这种武器威力惊人,一次可以消灭任一还活着的怪物。

一旦任一怪物到达城市,你就输掉了这场游戏。如果某个怪物  在某一分钟开始时到达城市,这会被视为 输掉 游戏,在你可以使用武器之前,游戏就会结束。

返回在你输掉游戏前可以消灭的怪物的 最大 数量。如果你可以在所有怪物到达城市前将它们全部消灭,返回  n 。

示例 1:

输入:dist = [1,3,4], speed = [1,1,1]
输出:3
解释:
第 0 分钟开始时,怪物的距离是 [1,3,4],你消灭了第一个怪物。
第 1 分钟开始时,怪物的距离是 [X,2,3],你没有消灭任何怪物。
第 2 分钟开始时,怪物的距离是 [X,1,2],你消灭了第二个怪物。
第 3 分钟开始时,怪物的距离是 [X,X,1],你消灭了第三个怪物。
所有 3 个怪物都可以被消灭。

示例 2:

输入:dist = [1,1,2,3], speed = [1,1,1,1]
输出:1
解释:
第 0 分钟开始时,怪物的距离是 [1,1,2,3],你消灭了第一个怪物。
第 1 分钟开始时,怪物的距离是 [X,0,1,2],你输掉了游戏。
你只能消灭 1 个怪物。

示例 3:

输入:dist = [3,2,4], speed = [5,3,2]
输出:1
解释:
第 0 分钟开始时,怪物的距离是 [3,2,4],你消灭了第一个怪物。
第 1 分钟开始时,怪物的距离是 [X,0,2],你输掉了游戏。 
你只能消灭 1 个怪物。

提示:

  • n == dist.length == speed.length
  • 1 <= n <= 10^5
  • 1 <= dist[i], speed[i] <= 10^5

解法1 贪心+排序

为了消灭尽可能多的怪物,我方需要坚持尽可能长的时间,因为我方每分钟都能消灭一个怪物。为了坚持更久,我方需要先消灭先来的怪物。因此,贪心的思路是将怪物的到达时间排序,先消灭到达时间早的怪物。我方的攻击时间序列是 [ 1 , 2 , 3 , … ] [1,2,3,\dots] [1,2,3,]将「我方的攻击时间序列」和「排序后的怪物到达时间」依次进行比较,当第一次出现到达时间小于等于攻击时间,即表示怪物到达城市,我方会输掉游戏

在比较时,因为我方的攻击时间为整数,因此可以将怪物到达时间向上取整,可以达到避免浮点数误差的效果。如果遍历完序列都没有出现这种情况,则表示我方可以消灭全部怪物。

class Solution {
public:int eliminateMaximum(vector<int>& dist, vector<int>& speed) {vector<int> a;int n = dist.size();for (int i = 0; i < n; ++i) a.push_back(i);sort(a.begin(), a.end(), [&](const int &u, const int &v) {double ma = 1.0 * dist[u] / speed[u];double mb = 1.0 * dist[v] / speed[v];return ma < mb;});int k = 0;while (k < n && 1.0 * dist[a[k]] / speed[a[k]] > k) ++k;return k;}
};

复杂度分析:

  • 时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 空间复杂度: O ( n ) O(n) O(n)

解法2 贪心+计数排序

着重讲解计数的思想:每只怪物都有一个最迟被解决的时间 T T T ,小于等于这个时间内,玩家可以随意选择一个时间去解决,而超过这个时间,怪物就会入侵城市,游戏也宣告失败。

计数数组 c o u n t count count ,就是用来记录每个最迟被解决的时间 T T T 上有多少个怪物 T T T 的计算公式是 T = ( d i s t [ i ] − 1 ) / s p e e d [ i ] T=(dist[i] - 1) / speed[i] T=(dist[i]1)/speed[i] 。当怪物的最迟被解决的时间 T T T 被计算出来后,对 c o u n t count count 进行 c o u n t [ T ] + + count[T]++ count[T]++ 操作。

有了计数数组 c o u n t count count 之后,我们就知道了在每个时刻,需要解决的怪物数量。这个时候,我们定义一个整数 k i l l kill kill 。表示我们在某个时间内能解决怪物的数量。如果在某个时刻我们能够解决怪物的数量 < 我们需要解决的怪物数量,说明怪物入侵城市,游戏失败。

k i l l kill kill 的计算规则也很简单,一分钟解决一只怪物,那么 t t t 时刻就能解决 t t t 只怪物

注意: c o u n t count count 的大小如何确定呢?因为 T T T 的计算结果不确定,如果我们直接定义最大的数组涵盖所有情况,又会导致空间的浪费。实际上, c o u n t count count 的大小设定为 n n n 即可,因为怪物一共有 n n n 只,最迟 n n n 时刻内就能解决掉所有怪物,所以对于超过 n n n T T T ,我们直接忽略就行。

class Solution {
public:int eliminateMaximum(vector<int>& dist, vector<int>& speed) {int n = dist.size();vector<int> count(n, 0);  //对每只怪物的最迟消灭时间进行计数for(int i = 0; i < n; i++) {int time = (dist[i] - 1) / speed[i]; //怪物需要在time时间内被消灭if(time < n) //time >= n的怪物不用管count[time]++;}int kill = 0; //能够击杀怪物的数量for(int i = 0; i < n; i++) {kill++;  //每过一秒能多击杀一只怪物kill -= count[i];  //减去限定时间需要击杀的怪物if(kill < 0)  //如果怪物到达城市return i + 1;}return n;}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n) ,其中 n n n 是数组 d i s t dist dist s p e e d speed speed 的长度。为两次遍历的时间复杂度。
  • 空间复杂度: O ( n ) O(n) O(n) 。需要一个数组保存怪物的到达时间。

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

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

相关文章

供应链 | 顶会CIKM论文精读:面向大规模三维装箱问题的数据驱动树形搜索算法

论文解读&#xff1a;丁建辉&#xff0c;李明哲&#xff0c;赵艳蓉&#xff0c;孙楚天 编者按 本次解读的文章发表于CCF-B类会议30th ACM International Conference on Information and Knowledge Management。摘要总结如下&#xff1a; 3维装箱问题&#xff08;3D-BPP&#…

Redis的缓存穿透,缓存击穿,缓存雪崩

1. 缓存穿透 什么是缓存穿透&#xff1f; 缓存穿透说简单点就是大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。这就导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨大的压力&…

雪花算法生成id分析与实践

目录 1 什么是雪花算法&#xff1f; 结构 优点 缺点 2 在java中使用 使用注意&#xff1a; 测试代码 效果 1 什么是雪花算法&#xff1f; witter的雪花算法&#xff08;Snowflake Algorithm&#xff09;。雪花ID是一种分布式唯一ID生成算法&#xff0c;旨在解决分布式…

业绩走低,毛利率下滑,海外市场能否成为极米科技救命稻草?

撰稿|行星 来源|贝多财经 8月30日&#xff0c;成都极米科技股份有限公司&#xff08;SH:688696&#xff0c;下称“极米科技”&#xff09;发布2023年半年度业绩报告。财报显示&#xff0c;极米科技2023年上半年的业绩出现了大幅下滑&#xff0c;其中收入同比减少两成&#xf…

代码随想录二刷day06

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣242. 有效的字母异位词二、力扣349. 两个数组的交集三、力扣202. 快乐数四、力扣1两数之和 前言 一、力扣242. 有效的字母异位词 class Solution {pub…

数学建模-点评笔记 9月3日

1.摘要&#xff1a;关键方法和结论&#xff08;精炼的语言&#xff09;要说明&#xff0c;方法的合理性和意义也可以说明。 评委先通过摘要筛选&#xff08;第一轮&#xff09; 2.时间序列找异常值除了3西格玛还有针对时间序列更合适寻找的方法 3.模型的优缺点要写的详细一点…

世微AP9234 升压型DC/DC LED恒流驱动

描述 AP9234是一款由基准电压源、振荡电路、误差放大电路、相位补偿电路、电流限制电路等构成的CMOS升压型DC/DC LED驱动。由于内置了低导通电阻的增强型N沟道功率MOSFET&#xff0c;因此适用于需要高效率、高输出电流的应用电路。另外&#xff0c;可通过在VSENSE端子连接电流…

754. 到达终点数字

754. 到达终点数字 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 754. 到达终点数字 https://leetcode.cn/problems/reach-a-number/description/ 完成情况&#xff1a; 解题思路&#xff1a; 牛顿莱布尼茨梯…

softmax的cuda编程详细解读——算子融合

softmax介绍 在上一篇博客我们介绍了softmax的内容以及相关的编程实现,总结一下softmax的特点如下:(没有特殊说明的情况下,考虑的仍然只是1D向量 x x x) 1:获得向量的全局最大值M 2:针对向量 x ^ = { exp ⁡ ( x i −

vue3 组件通信方式

文章目录 组件通信方式props自定义事件全局事件总线v-modeluseAttrsref与$parentprovide与injectpiniaslot 组件通信方式 props ​ 实现父子组件通信,在vue3中可以通过defineProps获取父组件传递的数据。且在组件内部不需要引入defineProps方法可以直接使用&#xff01; 父组…

SWAT-MODFLOW地表水与地下水耦合

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

ConsoleApplication815项目(直接加载+VEH Hook Load)

上线图 ConsoleApplication815.cpp #include <iostream> #include<Windows.h> #include "detours.h" #include "detver.h" #pragma comment(lib,"detours.lib")#pragma warning(disable:4996)LPVOID Beacon_address; SIZE_T Beacon…

leetcode分类刷题:哈希表(Hash Table)(三、循环存在问题)

1、当需要快速判断某元素是否出现在序列中时&#xff0c;就要用到哈希表了。 2、本文针对的总结题型为给定的序列或需要构造的序列中是否存在循环&#xff0c;与 160. 相交链表、 141. 环形链表、142. 环形链表 II的题型一样。 202. 快乐数 这道题还考察如何对正整数求解各个位…

用js的moment插件判断日期的格式是否符合‘YYYY-MM-DD‘

可以使用moment插件中的isValid()方法来判断一个日期字符串是否符合YYYY-MM-DD格式。 示例代码&#xff1a; const dateStr 2021-08-01; const dateFormat YYYY-MM-DD;const isValidDate moment(dateStr, dateFormat, true).isValid();console.log(isValidDate); // true这…

敏捷开发、V模型开发、瀑布模型

在软件开发领域&#xff0c;敏捷开发和V模型开发是两种主要的开发方法。它们之间的差异主要体现在开发过程的结构和组织方式上。在以下讨论中&#xff0c;我们将深入探讨这两种方法的特点和差异。 敏捷开发 敏捷开发是一种迭代和增量的软件开发方法&#xff0c;它强调灵活性和…

初识matlab

清空环境变量及命令 clear all 清除Workspace中的所有变量clc 清除Command Window中的所有命令 变量名命名规则 变量名区分大小写变量名长度不超过63位变量名以字母开头&#xff0c;可以由字母、数字和下划线组成&#xff0c;但不能使用标点变量名应简洁明了&#xff0c;通过…

Redis执行lua脚本-Time函数-获取当前时间

演变过程&#xff1a; TIME 命令返回当前服务器的时间&#xff0c;包含两个条目 Unix 时间戳和这一秒已经过去的微秒数。 eval " local res redis.call(time); return res; " 0 eval " local current_time redis.call(TIME) local unix_timestamp tonumb…

rz命令无法正常使用?

使用rz命令上传文件时出现如下问题&#xff1a; 这里用的是mobaxterm终端 改用xshell,secureCRT即可正常使用&#xff1a;

vscode调教配置:快捷修复和格式化代码

配置vscode快捷键&#xff0c;让你像使用idea一样使用vscode&#xff0c;我们最常用的两个功能就是格式化代码和快捷修复&#xff0c;所以这里修改一下快捷修复和格式化代码的快捷键。 在设置中&#xff0c;找到快捷键配置&#xff1a; 然后搜索&#xff1a;快捷修复 在快捷键…

STM32f103入门(3)按键控制LED灯以及光敏传感器控制LED

按键控制 技术点 控制LED的 GPIO 设置为输出控制按键的GPIO 设置为上拉输入 按键部分代码 Key.c #include "stm32f10x.h" #include "Delay.h" void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitSt…