12.3做题

一.车队问题

12.3做题_第1张图片

12.3做题_第2张图片

1.思路:

先把所在位置进行排序,升序排序,

计算出每辆车在不受其余车的影响时,行驶到终点需要的时间

从后往前看

对于相邻的两辆车 S 和 F,F 的起始位置大于 S,如果 S 行驶到终点需要的时间小于等于 F,那么 S 一定会在终点前追上 F 并形成车队。这是因为在追上 F 之前,S 的行驶速度并不会减小,而 F 却有可能因为追上前面的车辆而速度减小,因此 S 总能在终点前追上 F。

如果相邻的两辆车,在不受其余车的影响时,前者比后者行驶到终点需要的时间短,那么后者永远追不上前者,即从后者开始的若干辆车辆会组成一个新的车队;如果前者不比后者行驶到终点需要的时间短,那么后者可以在终点前追上前者,并和前者形成车队。此时我们将后者到达终点的时间置为前者到达终点的时间。

先建立车的类

里面存放到达终点的时间和初始位置

然后建立一个车的数组

按照距离升序排列

从后往前看,

前面的车比后面的车到达终点的时间长,后面的车就一定能追上 就把前面的时间置为后面的车时间 相当于一个车队

但是不能++.因为还没统计完

如果前面的车比后面的车到达终点的时间短,因为我们的车从后往前看.相同的都置为一个车队了.就不存在有前面车影响导致速度下降,所以是永远追不上的,所以就让车队数++.继续往前统计

统计到最后,因为第一辆车没办法再循环里,所以一定是所有车队+1

12.3做题_第3张图片

方法1:类

class Solution {
    public int carFleet(int target, int[] position, int[] speed) {
        int N=position.length;
        Car[] car=new Car[N];//定义一个车队数组
        for(int i=0;i(){
            public int compare(Car a,Car b){
                return a.position-b.position;
            }
        });//这里涉及自定义比较,需要实现接口
        //从后往前遍历 
        int ans=0;
        int i=N;
        while(--i>0){
            if(car[i-1].time>car[i].time){
                ans++;
            }else{
                car[i-1].time=car[i].time;
            }
        }
        return ans+1;
    }
}

这里有很多问题

我们需要复习一下自定义类的比较

一个就是就是建立一个内部类

根据数组的方法

就实现一个比较

12.3做题_第4张图片

要求升序,就是前面的减去后面的

12.3做题_第5张图片

还有就是在定义的时候就实现好.

12.3做题_第6张图片

或者实现一个Comparable接口,并重写comparTo方法,但是数组的话只能调用sort方法然后实现比较内部类

还有一种方法就是写一个比较器类并重写comparer方法 但是还是不行

12.3做题_第7张图片

12.3做题_第8张图片

注意事项:实现的时候记得要引入相应的包

12.3做题_第9张图片

方法2 二维数组

12.3做题_第10张图片

class Solution {
    public int carFleet(int target, int[] position, int[] speed) {
        int N = position.length;
        if (N <= 1) {
            return N;//只有一种的情况
        }
        double[][] cars = new double[N][2];
        for (int i = 0; i < N; i++) {
            cars[i][0] = position[i];
            cars[i][1] = (double) (target - position[i]) / speed[i];
        }//初始化
        Arrays.sort(cars, Comparator.comparingDouble(a -> a[0])); // 以初始位置排序,离出发点近的在前
        int ans = 0;
        for (int i = N - 1; i >= 1; i--) { // 从最靠近终点的车往出发点看(从终点往后看)
            if (cars[i][1] < cars[i - 1][1]) {
                ans++; // 如果比后一辆车到达终点的耗时短,那么后车一定追不上,所以当前车独立为一个车队
            } else {
                cars[i - 1] = cars[i]; // 如果比后一辆车慢或同时到达终点,那么将后车到达终点的时间置为本车到达终点的时间。(被当前车阻碍)
            }
        }
        return ans + 1; // 最后一个车队
    }
}

你可能感兴趣的:(菜鸟,算法,leetcode,职场和发展)