描述:
在由 2D 網格表示的校園裏有 n
位工人(worker
)和 m
輛自行車(bike
),n <= m
。所有工人和自行車的位置都用網格上的 2D 座標表示。
我們需要爲每位工人分配一輛自行車。在所有可用的自行車和工人中,我們選取彼此之間曼哈頓距離最短的工人自行車對 (worker, bike) ,並將其中的自行車分配給工人。如果有多個 (worker, bike) 對之間的曼哈頓距離相同,那麼我們選擇工人索引最小的那對。類似地,如果有多種不同的分配方法,則選擇自行車索引最小的一對。不斷重複這一過程,直到所有工人都分配到自行車爲止。
給定兩點 p1
和 p2
之間的曼哈頓距離爲 Manhattan(p1, p2) = |p1.x - p2.x| + |p1.y - p2.y|
。
返回長度爲 n
的向量 ans
,其中 a[i]
是第 i
位工人分配到的自行車的索引(從 0 開始)。
示例 1:
輸入:workers = [[0,0],[2,1]], bikes = [[1,2],[3,3]] 輸出:[1,0] 解釋: 工人 1 分配到自行車 0,因爲他們最接近且不存在衝突,工人 0 分配到自行車 1 。所以輸出是 [1,0]。
示例 2:
輸入:workers = [[0,0],[1,1],[2,0]], bikes = [[1,0],[2,2],[2,1]] 輸出:[0,2,1] 解釋: 工人 0 首先分配到自行車 0 。工人 1 和工人 2 與自行車 2 距離相同,因此工人 1 分配到自行車 2,工人 2 將分配到自行車 1 。因此輸出爲 [0,2,1]。
提示:
0 <= workers[i][j], bikes[i][j] < 1000
- 所有工人和自行車的位置都不相同。
1 <= workers.length <= bikes.length <= 1000
代碼:
class Solution {
public int[] assignBikes(int[][] workers, int[][] bikes) {
int wl=workers.length;
int bl=bikes.length;
int[] result=new int[wl];
boolean[] hasWorkers=new boolean[wl];
Map<Integer, ArrayList<List<Integer>>> map=new HashMap<Integer, ArrayList<List<Integer>>>();
for(int i=0;i<wl;i++){
for(int j=0;j<bl;j++){
int W_B_length=Math.abs(workers[i][0]-bikes[j][0])+Math.abs(workers[i][1]-bikes[j][1]);
boolean iskey=map.containsKey(W_B_length);
if(iskey==true){
map.get(W_B_length).add(Arrays.asList(i,j));
}else{
map.put(W_B_length, new ArrayList<List<Integer>>(Arrays.asList(Arrays.asList(i,j))));
}
}
}
Set<Integer> keys=map.keySet();
Object[] key1=keys.toArray();
Arrays.sort(key1);
for(Object key:key1){
List<List<Integer>> value=map.get(key);
for(int i=0;i<value.size();i++){
int workersId=value.get(i).get(0);
int bikesId=value.get(i).get(1);
if(hasWorkers[workersId]==true||hasBikes[bikesId]==true)
continue;
result[workersId]=bikesId;
hasWorkers[workersId]=true;
hasBikes[bikesId]=true;
}
}
return result;
}
}