校園自行車分配

描述:

在由 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]。

 

提示:

  1. 0 <= workers[i][j], bikes[i][j] < 1000
  2. 所有工人和自行車的位置都不相同。
  3. 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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章