在由 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 開始)。
資料範圍:
0 <= workers[i][j], bikes[i][j] < 1000
所有工人和自行車的位置都不相同。
1 <= workers.length <= bikes.length <= 1000
乙個思路是列舉處所有曼哈頓距離和對應索引(distance, i, j)
然後按照從小到大順序排列, 遍歷排好序的陣列,dis,i, j
記錄索引i, j
是否被使用, 如果沒有被使用, 可以有ret[i] = j
, 按理說不會超時的, 我是用資料結果是vector> dis
, 其中每個vector
都是類似的三元組, 但是呼叫的時候一直超時, 後來自己定義了node
類和比較函式通過了.
**如下, 演算法複雜度m
nlog(
mn
)mn\log(mn)
mnlog(mn
)
class
node
bool
operator
<
(node &b)};
class
solution
vector<
int>
assignbikes
(vectorint>>
& workers, vectorint>>
& bikes)
; vector<
int>
ret(n,-1
);vector dis;
for(
int i =
0; i < n;
++i)
}sort
(dis.
begin()
, dis.
end())
;int cnt =0;
vector<
bool
>
v(m,
false);
for(
auto
&d: dis)
if(cnt == n)
break;}
return ret;}}
;
我看到乙個比較好的思路, 使用桶排序, 由於給定了自行車和人座標的範圍, 那麼曼哈頓距離最大值可以確定為2000, 構造桶就可以了, 在遍歷的時候把i, j
pair 填入對應曼哈頓距離的桶中, 同時由於遍歷順序是從小到大, 那麼通裡面的vector
也是排好順序的. **如下:
演算法複雜度是 o(m
n)
o(mn)
o(mn
)
class
solution
; vectorint,
int>>
>
bucket
(2001);
for(
int i =
0; i < m;
++i));
}}vector<
int>
res(n ,-1
);vector<
int>
bikeused
(m ,
false);
for(
int i =
0; i < bucket.
size()
;++i)}}
return res;
}int
getd
(int x1,
int x2,
int y1,
int y2 )
};
Leetcode 杯題解 校園自行車分配
在由 2d 網格表示的校園裡有n位工人 worker 和m輛自行車 bike n m。所有工人和自行車的位置都用網格上的 2d 座標表示。我們需要為每位工人分配一輛自行車。在所有可用的自行車和工人中,我們選取彼此之間曼哈頓距離最短的工人自行車對 worker,bike 並將其中的自行車分配給工人。如...
LeetCode 728 自除數 C語言解法
自除數 是指可以被它包含的每一位數除盡的數。例如,128 是乙個自除數,因為128 1 0,128 2 0,128 8 0。還有,自除數不允許包含 0 給定上邊界和下邊界數字,輸出乙個列表,列表的元素是邊界 含邊界 內所有的自除數。示例 1 輸入 上邊界left 1,下邊界right 22 輸出 1...
leetcode(17)自除數的js 實現
自除數 是指可以被它包含的每一位數除盡的數。例如,128 是乙個自除數,因為 128 1 0,128 2 0,128 8 0。還有,自除數不允許包含 0 給定上邊界和下邊界數字,輸出乙個列表,列表的元素是邊界 含邊界 內所有的自除數。示例 1 輸入 上邊界left 1,下邊界right 22 輸出 ...