LeetCode 1057 校園自行車分配

2021-10-07 11:12:26 字數 2443 閱讀 4291

在由 2d 網格表示的校園裡有n位工人(worker)和m輛自行車(bike),n <= m。所有工人和自行車的位置都用網格上的 2d 座標表示。

我們需要為每位工人分配一輛自行車。在所有可用的自行車和工人中,我們選取彼此之間曼哈頓距離最短的工人自行車對(worker, bike),並將其中的自行車分配給工人。如果有多個(worker, bike)對之間的曼哈頓距離相同,那麼我們選擇工人索引最小的那對。類似地,如果有多種不同的分配方法,則選擇自行車索引最小的一對。不斷重複這一過程,直到所有工人都分配到自行車為止。

給定兩點p1p2之間的曼哈頓距離為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, jpair 填入對應曼哈頓距離的桶中, 同時由於遍歷順序是從小到大, 那麼通裡面的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 輸出 ...