Skip to content

Commit 421b630

Browse files
committed
feat: add solutions to lc problem: No.1057
No.1057.Campus Bikes
1 parent 75e3e87 commit 421b630

File tree

6 files changed

+360
-2
lines changed

6 files changed

+360
-2
lines changed

solution/1000-1099/1057.Campus Bikes/README.md

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,148 @@
5858

5959
<!-- 这里可写通用的实现逻辑 -->
6060

61+
**方法一:排序**
62+
63+
先计算每个工人和每个自行车之间的曼哈顿距离,然后按照曼哈顿距离从小到大排序,遍历排序后的数组,如果当前工人和自行车都未被分配,则分配给当前工人和自行车。
64+
65+
时间复杂度 $O(n\times m\times \log (n\times m))$。其中 $n$ 和 $m$ 分别为工人和自行车的数量。
66+
6167
<!-- tabs:start -->
6268

6369
### **Python3**
6470

6571
<!-- 这里可写当前语言的特殊实现逻辑 -->
6672

6773
```python
68-
74+
class Solution:
75+
def assignBikes(self, workers: List[List[int]], bikes: List[List[int]]) -> List[int]:
76+
n, m = len(workers), len(bikes)
77+
arr = []
78+
for i, j in product(range(n), range(m)):
79+
dist = abs(workers[i][0] - bikes[j][0]) + \
80+
abs(workers[i][1] - bikes[j][1])
81+
arr.append((dist, i, j))
82+
arr.sort()
83+
vis1 = [False] * n
84+
vis2 = [False] * m
85+
ans = [0] * n
86+
for _, i, j in arr:
87+
if not vis1[i] and not vis2[j]:
88+
vis1[i] = vis2[j] = True
89+
ans[i] = j
90+
return ans
6991
```
7092

7193
### **Java**
7294

7395
<!-- 这里可写当前语言的特殊实现逻辑 -->
7496

7597
```java
98+
class Solution {
99+
public int[] assignBikes(int[][] workers, int[][] bikes) {
100+
int n = workers.length, m = bikes.length;
101+
int[][] arr = new int[m * n][3];
102+
for (int i = 0, k = 0; i < n; ++i) {
103+
for (int j = 0; j < m; ++j) {
104+
int dist = Math.abs(workers[i][0] - bikes[j][0]) + Math.abs(workers[i][1] - bikes[j][1]);
105+
arr[k++] = new int[] {dist, i, j};
106+
}
107+
}
108+
Arrays.sort(arr, (a, b) -> {
109+
if (a[0] != b[0]) {
110+
return a[0] - b[0];
111+
}
112+
if (a[1] != b[1]) {
113+
return a[1] - b[1];
114+
}
115+
return a[2] - b[2];
116+
});
117+
boolean[] vis1 = new boolean[n];
118+
boolean[] vis2 = new boolean[m];
119+
int[] ans = new int[n];
120+
for (var e : arr) {
121+
int i = e[1], j = e[2];
122+
if (!vis1[i] && !vis2[j]) {
123+
vis1[i] = true;
124+
vis2[j] = true;
125+
ans[i] = j;
126+
}
127+
}
128+
return ans;
129+
}
130+
}
131+
```
132+
133+
### **C++**
134+
135+
```cpp
136+
class Solution {
137+
public:
138+
vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
139+
int n = workers.size(), m = bikes.size();
140+
vector<tuple<int, int, int>> arr(n * m);
141+
for (int i = 0, k = 0; i < n; ++i) {
142+
for (int j = 0; j < m; ++j) {
143+
int dist = abs(workers[i][0] - bikes[j][0]) + abs(workers[i][1] - bikes[j][1]);
144+
arr[k++] = {dist, i, j};
145+
}
146+
}
147+
sort(arr.begin(), arr.end());
148+
vector<bool> vis1(n), vis2(m);
149+
vector<int> ans(n);
150+
for (auto& [_, i, j] : arr) {
151+
if (!vis1[i] && !vis2[j]) {
152+
vis1[i] = true;
153+
vis2[j] = true;
154+
ans[i] = j;
155+
}
156+
}
157+
return ans;
158+
}
159+
};
160+
```
76161
162+
### **Go**
163+
164+
```go
165+
func assignBikes(workers [][]int, bikes [][]int) []int {
166+
n, m := len(workers), len(bikes)
167+
type tuple struct{ d, i, j int }
168+
arr := make([]tuple, n*m)
169+
for i, k := 0, 0; i < n; i++ {
170+
for j := 0; j < m; j++ {
171+
d := abs(workers[i][0]-bikes[j][0]) + abs(workers[i][1]-bikes[j][1])
172+
arr[k] = tuple{d, i, j}
173+
k++
174+
}
175+
}
176+
sort.Slice(arr, func(i, j int) bool {
177+
if arr[i].d != arr[j].d {
178+
return arr[i].d < arr[j].d
179+
}
180+
if arr[i].i != arr[j].i {
181+
return arr[i].i < arr[j].i
182+
}
183+
return arr[i].j < arr[j].j
184+
})
185+
vis1, vis2 := make([]bool, n), make([]bool, m)
186+
ans := make([]int, n)
187+
for _, e := range arr {
188+
i, j := e.i, e.j
189+
if !vis1[i] && !vis2[j] {
190+
vis1[i], vis2[j] = true, true
191+
ans[i] = j
192+
}
193+
}
194+
return ans
195+
}
196+
197+
func abs(x int) int {
198+
if x < 0 {
199+
return -x
200+
}
201+
return x
202+
}
77203
```
78204

79205
### **...**

solution/1000-1099/1057.Campus Bikes/README_EN.md

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,133 @@
5353
### **Python3**
5454

5555
```python
56-
56+
class Solution:
57+
def assignBikes(self, workers: List[List[int]], bikes: List[List[int]]) -> List[int]:
58+
n, m = len(workers), len(bikes)
59+
arr = []
60+
for i, j in product(range(n), range(m)):
61+
dist = abs(workers[i][0] - bikes[j][0]) + \
62+
abs(workers[i][1] - bikes[j][1])
63+
arr.append((dist, i, j))
64+
arr.sort()
65+
vis1 = [False] * n
66+
vis2 = [False] * m
67+
ans = [0] * n
68+
for _, i, j in arr:
69+
if not vis1[i] and not vis2[j]:
70+
vis1[i] = vis2[j] = True
71+
ans[i] = j
72+
return ans
5773
```
5874

5975
### **Java**
6076

6177
```java
78+
class Solution {
79+
public int[] assignBikes(int[][] workers, int[][] bikes) {
80+
int n = workers.length, m = bikes.length;
81+
int[][] arr = new int[m * n][3];
82+
for (int i = 0, k = 0; i < n; ++i) {
83+
for (int j = 0; j < m; ++j) {
84+
int dist = Math.abs(workers[i][0] - bikes[j][0]) + Math.abs(workers[i][1] - bikes[j][1]);
85+
arr[k++] = new int[] {dist, i, j};
86+
}
87+
}
88+
Arrays.sort(arr, (a, b) -> {
89+
if (a[0] != b[0]) {
90+
return a[0] - b[0];
91+
}
92+
if (a[1] != b[1]) {
93+
return a[1] - b[1];
94+
}
95+
return a[2] - b[2];
96+
});
97+
boolean[] vis1 = new boolean[n];
98+
boolean[] vis2 = new boolean[m];
99+
int[] ans = new int[n];
100+
for (var e : arr) {
101+
int i = e[1], j = e[2];
102+
if (!vis1[i] && !vis2[j]) {
103+
vis1[i] = true;
104+
vis2[j] = true;
105+
ans[i] = j;
106+
}
107+
}
108+
return ans;
109+
}
110+
}
111+
```
112+
113+
### **C++**
114+
115+
```cpp
116+
class Solution {
117+
public:
118+
vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
119+
int n = workers.size(), m = bikes.size();
120+
vector<tuple<int, int, int>> arr(n * m);
121+
for (int i = 0, k = 0; i < n; ++i) {
122+
for (int j = 0; j < m; ++j) {
123+
int dist = abs(workers[i][0] - bikes[j][0]) + abs(workers[i][1] - bikes[j][1]);
124+
arr[k++] = {dist, i, j};
125+
}
126+
}
127+
sort(arr.begin(), arr.end());
128+
vector<bool> vis1(n), vis2(m);
129+
vector<int> ans(n);
130+
for (auto& [_, i, j] : arr) {
131+
if (!vis1[i] && !vis2[j]) {
132+
vis1[i] = true;
133+
vis2[j] = true;
134+
ans[i] = j;
135+
}
136+
}
137+
return ans;
138+
}
139+
};
140+
```
62141
142+
### **Go**
143+
144+
```go
145+
func assignBikes(workers [][]int, bikes [][]int) []int {
146+
n, m := len(workers), len(bikes)
147+
type tuple struct{ d, i, j int }
148+
arr := make([]tuple, n*m)
149+
for i, k := 0, 0; i < n; i++ {
150+
for j := 0; j < m; j++ {
151+
d := abs(workers[i][0]-bikes[j][0]) + abs(workers[i][1]-bikes[j][1])
152+
arr[k] = tuple{d, i, j}
153+
k++
154+
}
155+
}
156+
sort.Slice(arr, func(i, j int) bool {
157+
if arr[i].d != arr[j].d {
158+
return arr[i].d < arr[j].d
159+
}
160+
if arr[i].i != arr[j].i {
161+
return arr[i].i < arr[j].i
162+
}
163+
return arr[i].j < arr[j].j
164+
})
165+
vis1, vis2 := make([]bool, n), make([]bool, m)
166+
ans := make([]int, n)
167+
for _, e := range arr {
168+
i, j := e.i, e.j
169+
if !vis1[i] && !vis2[j] {
170+
vis1[i], vis2[j] = true, true
171+
ans[i] = j
172+
}
173+
}
174+
return ans
175+
}
176+
177+
func abs(x int) int {
178+
if x < 0 {
179+
return -x
180+
}
181+
return x
182+
}
63183
```
64184

65185
### **...**
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
public:
3+
vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
4+
int n = workers.size(), m = bikes.size();
5+
vector<tuple<int, int, int>> arr(n * m);
6+
for (int i = 0, k = 0; i < n; ++i) {
7+
for (int j = 0; j < m; ++j) {
8+
int dist = abs(workers[i][0] - bikes[j][0]) + abs(workers[i][1] - bikes[j][1]);
9+
arr[k++] = {dist, i, j};
10+
}
11+
}
12+
sort(arr.begin(), arr.end());
13+
vector<bool> vis1(n), vis2(m);
14+
vector<int> ans(n);
15+
for (auto& [_, i, j] : arr) {
16+
if (!vis1[i] && !vis2[j]) {
17+
vis1[i] = true;
18+
vis2[j] = true;
19+
ans[i] = j;
20+
}
21+
}
22+
return ans;
23+
}
24+
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
func assignBikes(workers [][]int, bikes [][]int) []int {
2+
n, m := len(workers), len(bikes)
3+
type tuple struct{ d, i, j int }
4+
arr := make([]tuple, n*m)
5+
for i, k := 0, 0; i < n; i++ {
6+
for j := 0; j < m; j++ {
7+
d := abs(workers[i][0]-bikes[j][0]) + abs(workers[i][1]-bikes[j][1])
8+
arr[k] = tuple{d, i, j}
9+
k++
10+
}
11+
}
12+
sort.Slice(arr, func(i, j int) bool {
13+
if arr[i].d != arr[j].d {
14+
return arr[i].d < arr[j].d
15+
}
16+
if arr[i].i != arr[j].i {
17+
return arr[i].i < arr[j].i
18+
}
19+
return arr[i].j < arr[j].j
20+
})
21+
vis1, vis2 := make([]bool, n), make([]bool, m)
22+
ans := make([]int, n)
23+
for _, e := range arr {
24+
i, j := e.i, e.j
25+
if !vis1[i] && !vis2[j] {
26+
vis1[i], vis2[j] = true, true
27+
ans[i] = j
28+
}
29+
}
30+
return ans
31+
}
32+
33+
func abs(x int) int {
34+
if x < 0 {
35+
return -x
36+
}
37+
return x
38+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
class Solution {
2+
public int[] assignBikes(int[][] workers, int[][] bikes) {
3+
int n = workers.length, m = bikes.length;
4+
int[][] arr = new int[m * n][3];
5+
for (int i = 0, k = 0; i < n; ++i) {
6+
for (int j = 0; j < m; ++j) {
7+
int dist = Math.abs(workers[i][0] - bikes[j][0]) + Math.abs(workers[i][1] - bikes[j][1]);
8+
arr[k++] = new int[] {dist, i, j};
9+
}
10+
}
11+
Arrays.sort(arr, (a, b) -> {
12+
if (a[0] != b[0]) {
13+
return a[0] - b[0];
14+
}
15+
if (a[1] != b[1]) {
16+
return a[1] - b[1];
17+
}
18+
return a[2] - b[2];
19+
});
20+
boolean[] vis1 = new boolean[n];
21+
boolean[] vis2 = new boolean[m];
22+
int[] ans = new int[n];
23+
for (var e : arr) {
24+
int i = e[1], j = e[2];
25+
if (!vis1[i] && !vis2[j]) {
26+
vis1[i] = true;
27+
vis2[j] = true;
28+
ans[i] = j;
29+
}
30+
}
31+
return ans;
32+
}
33+
}

0 commit comments

Comments
 (0)