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

Leetcode力扣秋招刷题路-0853

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结

853. 车队

在一条单行道上,有 n 辆车开往同一目的地。目的地是几英里以外的 target 。

给定两个整数数组 position 和 speed ,长度都是 n ,其中 position[i] 是第 i 辆车的位置, speed[i] 是第 i 辆车的速度(单位是英里/小时)。

一辆车永远不会超过前面的另一辆车,但它可以追上去,并与前车 以相同的速度 紧接着行驶。此时,我们会忽略这两辆车之间的距离,也就是说,它们被假定处于相同的位置。

车队 是一些由行驶在相同位置、具有相同速度的车组成的非空集合。注意,一辆车也可以是一个车队。

即便一辆车在目的地才赶上了一个车队,它们仍然会被视作是同一个车队。

返回到达目的地的 车队数量 。

示例 1:
输入:target = 12, position = [10,8,0,5,3], speed = [2,4,1,1,3]
输出:3
解释:
从 10 和 8 开始的车会组成一个车队,它们在 12 处相遇。
从 0 处开始的车无法追上其它车,所以它自己就是一个车队。
从 5 和 3 开始的车会组成一个车队,它们在 6 处相遇。
请注意,在到达目的地之前没有其它车会遇到这些车队,所以答案是 3。

示例 2:
输入: target = 10, position = [3], speed = [3]
输出: 1
解释: 只有一辆车,因此只有一个车队。

示例 3:
输入: target = 100, position = [0,2,4], speed = [4,2,1]
输出: 1
解释:
以0(速度4)和2(速度2)出发的车辆组成车队,在4点相遇。舰队以2的速度前进。
然后,车队(速度2)和以4(速度1)出发的汽车组成一个车队,在6点相遇。舰队以1的速度前进,直到到达目标。

提示:
n == position.length == speed.length
1 <= n <= 1 0 5 10^5 105
0 < target <= 1 0 6 10^6 106
0 <= position[i] < target
position 中每个值都不同
0 < speed[i] <= 1 0 6 10^6 106

思路

新建一个类Data,包含pos和speed两个属性,然后新建这个类对象数组datas;
对datas根据pos从小到大排序;
然后从大到小遍历datas数组,不断的判断当前车是否能够与行驶在前面的车队相遇,若能相遇,则将其并到前面车队中,否则当前车另起一个车队。
如何判断是否能够相遇

位置小的车要超过行驶在前面位置大的车,必须速度大一点,然后判断相遇的地点是否在终点target之前,若在target之前,说明能够相遇。
注意事项 题目说了 一辆车永远不会超过前面的另一辆车,但它可以追上去,并与前车以相同的速度紧接着行驶 ,因此,在从位置大的往位置小遍历过程中,我们只需要判断是否能追的上最近的车队即可。因为,假设当前车前面有[车队A,车队B],既然是两个车队,说明车队A追不上车队B,因此假设当前车追不上车队A,那么他一定追不上车队B。

public class Problem853 {

    class Data {
        int position;
        int speed;
        Data(int position, int speed) {
            this.position = position;
            this.speed = speed;
        }
    }

    private boolean isMeet(Data data1, Data data2, int target) {
        if (data1.speed <= data2.speed) {
            return false;
        }

        double t = (data2.position - data1.position) * 1.0 / (data1.speed - data2.speed);
        return data1.speed * t + data1.position <= target;
    }

    public int carFleet(int target, int[] position, int[] speed) {
        int len = position.length;
        if (len == 0) {
            return 0;
        }
        Data[] datas = new Data[len];

        for (int i = 0; i < len; i++) {
            datas[i] = new Data(position[i], speed[i]);
        }

        Arrays.sort(datas, Comparator.comparingInt(o -> o.position));

        int ans = 1;
        Data frontCar = datas[len - 1];
        for (int i = len - 2; i >= 0; i--) {
            if (!isMeet(datas[i], frontCar, target)) {
                ans++;
                frontCar = datas[i];
            }
        }

        return ans;
    }

}

复杂度分析 时间复杂度:O(nlogn)。因为存在排序。 空间复杂度:O(n)。


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

相关文章:

  • 华为ensp实验二--mux vlan的应用
  • Java基础-组件及事件处理(中)
  • WebAssembly在桌面级应用开发中的探索与实践
  • Mac——基本操作使用整理
  • 【第五课】Rust所有权系统(一)
  • 牛客题库 21738 牛牛与数组
  • 能上网的ChatGPT,会带来什么改变
  • 【信息安全案例】——身份与访问安全(学习笔记)
  • HashMap为什么数组长度是2的幂
  • 如何真正认识 Linux 系统结构?这篇文章告诉你
  • 【VM服务管家】VM4.x算子SDK开发_3.1 环境配置类
  • ChatGPT探索系列之五:讨论人工智能伦理问题及ChatGPT的责任
  • Docker consul的容器集群的部署|consul-template部署
  • 【论文阅读】轻量化网络MobileNet-V1
  • IDEA弹出`Lombok requires enabled annotation processing`错误信息
  • Codeforces Round 867 (Div. 3)
  • Mysql 存储过程 / 存储函数
  • 博弈论又称对策论的入门及在军事博弈问题上的简单实战
  • conda命令
  • 【MySQL】数据表的增删查改
  • ChatGPT技术原理 第六章:对话生成技术
  • 【VQ-VAE代码实战】Neural Discrete Representation Learning
  • Kafka3.0.0版本——生产者数据有序与乱序
  • 在linux下搭建clash服务
  • 学生成绩管理系统 002
  • Java阶段二Day07