leetcode
leetcode 901 ~ 950
校园自行车分配

校园自行车分配

难度:

标签:

题目描述

代码结果

运行时间: 463 ms, 内存: 107.9 MB


/*
 * 思路:
 * 1. 使用流计算每对学生和自行车的距离,并存储到一个列表中。
 * 2. 对列表进行排序。
 * 3. 使用流从最短距离开始分配自行车给学生。
 */

import java.util.*;
import java.util.stream.*;

public class CampusBikeAssignmentStream {
    public int[] assignBikes(int[][] students, int[][] bikes) {
        int n = students.length;
        int m = bikes.length;
        int[] result = new int[n];
        boolean[] bikeAssigned = new boolean[m];
        Arrays.fill(result, -1);

        List<int[]> distances = IntStream.range(0, n)
            .boxed()
            .flatMap(i -> IntStream.range(0, m)
                .mapToObj(j -> new int[]{Math.abs(students[i][0] - bikes[j][0]) + Math.abs(students[i][1] - bikes[j][1]), i, j}))
            .sorted(Comparator.comparingInt(a -> a[0]))
            .collect(Collectors.toList());

        distances.stream()
            .filter(distance -> result[distance[1]] == -1 && !bikeAssigned[distance[2]])
            .forEach(distance -> {
                result[distance[1]] = distance[2];
                bikeAssigned[distance[2]] = true;
            });

        return result;
    }
}

解释

方法:

这个题解采用了桶排序的策略(bucket sort)来处理校园自行车分配问题。首先计算每个工人到每辆自行车的曼哈顿距离,并将每对(工人, 自行车)根据距离分到不同的桶中。因为最大可能距离为2000,所以桶的数量也是2000。在所有距离计算完并分桶之后,按距离从小到大的顺序(即桶的顺序)来分配自行车给工人。如果一个工人已经分配了自行车或一个自行车已经被分配,就跳过,直到所有工人都被分配自行车。

时间复杂度:

O(MN)

空间复杂度:

O(MN)

代码细节讲解

🦆
为什么选择桶排序来处理校园自行车分配问题,而不是其他排序方法?
桶排序在处理自行车分配问题时具有显著的优势,因为它能高效地处理按距离排序的需求。桶排序的时间复杂度为O(n),在距离的最大范围已知且有限(如2000)的情况下,这种排序方法比其他常规的排序算法(如快速排序、归并排序等O(n log n)的算法)更为高效。此外,桶排序能够直接根据距离将工人和自行车的对应关系分类到不同的桶中,这使得实现按照距离优先的分配策略变得直接和简单。
🦆
桶排序的具体实现中,如何保证每个工人只被分配到最近的自行车?
在桶排序的具体实现中,每个桶代表一种特定的曼哈顿距离,桶中存储了所有该距离下的工人和自行车的配对关系。算法从距离最小的桶开始处理,依次检查每个桶中的配对关系。对于每对工人和自行车,如果该工人未被分配自行车且该自行车未被分配,则将此自行车分配给该工人,并标记此自行车为已用。这种方式确保了每个工人都被优先分配到距离最近的自行车,因为一旦工人被分配了自行车,就不会再考虑其他更远距离的自行车。
🦆
在题解中提到最大可能距离为2000,这个数字是如何计算出来的?
最大可能的曼哈顿距离是基于坐标平面上两点之间的距离计算得出的。假设坐标的取值范围是0到1000,曼哈顿距离是两点之间在x轴和y轴方向上差的绝对值之和。因此,两点的最大曼哈顿距离发生在一点在坐标原点(0,0),另一点在(1000,1000)时,此时距离为1000+1000=2000。这是在坐标范围最大化的情况下计算出的最大可能曼哈顿距离。
🦆
如果有多对工人和自行车具有相同的最小曼哈顿距离,题解中的算法如何决定分配顺序?
当多对工人和自行车具有相同的最小曼哈顿距离时,题解中的算法按照它们在输入列表中的顺序来决定分配顺序。具体来说,算法先遍历所有工人,对于每个工人按照自行车列表的顺序计算距离并将对应的配对关系添加到相应的桶中。因此,如果存在相同距离的多个配对关系,它们在桶中的顺序反映了它们在原始列表中的相对顺序。在分配时,算法也会遵循这个顺序,从而保持一种稳定的分配顺序。

相关问题

校园自行车分配 II

校园自行车分配 II