校园自行车分配
难度:
标签:
题目描述
代码结果
运行时间: 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)
代码细节讲解
🦆
为什么选择桶排序来处理校园自行车分配问题,而不是其他排序方法?
▷🦆
桶排序的具体实现中,如何保证每个工人只被分配到最近的自行车?
▷🦆
在题解中提到最大可能距离为2000,这个数字是如何计算出来的?
▷🦆
如果有多对工人和自行车具有相同的最小曼哈顿距离,题解中的算法如何决定分配顺序?
▷