题目地址:
https://leetcode.com/problems/campus-bikes/
在平面直角坐标系里,给定 n n n个工人的坐标和 m m m个自行车的坐标( m ≥ n m\ge n m≥n并且它们的坐标两两不同),按照下面的规则给每个工人分配一个自行车:距离近的工人、自行车优先分配,如果有一样近的,则工人下标小的优先分配,如果还有一样,则自行车下标小的优先分配。问最后每个工人分配到的自行车的下标。
先将距离、工人下标、自行车下标做成三元组,这样一共有 m n mn mn个三元组,然后将其按照上面的分配规则排序,然后依次把自行车分配给工人。代码如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
public int[] assignBikes(int[][] workers, int[][] bikes) {
List<int[]> dist = new ArrayList<>();
for (int i = 0; i < workers.length; i++) {
for (int j = 0; j < bikes.length; j++) {
int x1 = workers[i][0], y1 = workers[i][1];
int x2 = bikes[j][0], y2 = bikes[j][1];
int dis = Math.abs(x1 - x2) + Math.abs(y1 - y2);
dist.add(new int[]{dis, i, j});
}
}
dist.sort((d1, d2) -> d1[0] != d2[0] ? Integer.compare(d1[0], d2[0]) : d1[1] != d2[1] ? Integer.compare(d1[1], d2[1]) : Integer.compare(d1[2], d2[2]));
int[] res = new int[workers.length];
Arrays.fill(res, -1);
boolean[] used = new boolean[bikes.length];
for (int[] d : dist) {
int idxW = d[1], idxB = d[2];
if (!used[idxB] && res[idxW] == -1) {
res[idxW] = idxB;
used[idxB] = true;
}
}
return res;
}
}
时间复杂度 O ( m n log m n ) O(mn\log mn) O(mnlogmn),空间 O ( m n ) O(mn) O(mn)。