当前位置: 首页 > article >正文

1921.消灭怪物的最大数量

1921. 消灭怪物的最大数量

题目来源:力扣

dist:距离 speed:速度

解题方法:贪心+排序

求消灭怪物最带的数量:

  • 先消灭到达时间早的

  • 用贪心的思路将到达时间排序(得出消灭顺序)

  • 将攻击时间顺序与排序后的怪物到达时间进行比较

代码如下:

class Solution {
     public int eliminateMaximum(int[] dist, int[] speed) {
         int n = dist.length;
         int[] arrivalTimes = new int[n];
         for (int i = 0; i < n; i++) {
             arrivalTimes[i] = (dist[i] - 1) / speed[i] + 1;
         }
         Arrays.sort(arrivalTimes);
         for (int i = 0; i < n; i++) {
             if (arrivalTimes[i] <= i) {
                 return i;
             }
         }
         return n;
     }
 }
代码逻辑
  1. 初始化

    • 代码接收两个整数数组 distspeed 作为输入,分别表示每个怪物的初始距离和移动速度。

    • n 表示怪物的数量,即数组的长度。

    • 创建一个长度为 n 的整数数组 arrivalTimes,用于存储每个怪物到达你的时间。

  2. 计算到达时间

    • 通过一个 for 循环遍历每个怪物,计算其到达时间。

    • 到达时间的计算公式为 (dist[i] - 1) / speed[i] + 1,这是因为怪物到达你时,其移动的距离至少为 dist[i],使用 (dist[i] - 1) / speed[i] + 1 可以确保计算出的是整数时间。

  3. 对到达时间排序

    • 使用 Arrays.sort(arrivalTimes)arrivalTimes 数组进行排序,以便按照怪物到达的先后顺序处理。

  4. 检查可消灭的怪物数量

    • 再次使用 for 循环遍历排序后的 arrivalTimes 数组。

    • 对于每个怪物,如果其到达时间 arrivalTimes[i] 小于等于当前时间 i(因为每秒可以消灭一个怪物,所以 i 表示当前时间),说明该怪物在你消灭它之前就已经到达,此时返回 i,表示最多能消灭 i 个怪物。

    • 如果所有怪物都能在到达之前被消灭,则返回 n,表示可以消灭所有怪物。

复杂度分析

  • 时间复杂度O(nlogn),其中 n 是怪物的数量。主要时间开销在于对 arrivalTimes 数组进行排序,排序的时间复杂度为 O(nlogn),而计算到达时间和检查可消灭的怪物数量的时间复杂度均为 O(n)。

  • 空间复杂度O(n),主要空间开销在于创建了一个长度为 narrivalTimes 数组。

有更好的解法,欢迎评论或私信


http://www.kler.cn/a/614074.html

相关文章:

  • -JavaEE 应用Servlet 路由技术JDBCMybatis 数据库生命周期
  • Gateway实战(二)、负载均衡
  • 【Java】JVM
  • pytest-xdist 进行高效并行自动化测试
  • LeetCode hot 100—LRU缓存
  • SQL 通用表表达式(CTE )
  • MetInfo6.0.0目录遍历漏洞原理分析
  • C++11QT复习 (三)
  • QT mingw编译器使用gdb调试
  • 2025 年前端新趋势:拥抱 Web Component 与性能优化
  • aioredis.from_url函数详解
  • 7.1 分治-快排专题:LeetCode 75. 颜色分类
  • postgresql+patroni+etcd高可用安装
  • 微软开源 “Hyperlight Wasm”,将轻量级虚拟机技术扩展至 WASM
  • 使用ModbusRTU读取松下测高仪的高度
  • 微软和Linux
  • 深入理解MySQL中的脏读、幻读、不可重复读(附实战复现源码)
  • 【VSCode的安装与配置】
  • vue create创建 Vue-router 工程
  • 搭建前端环境和后端环境