Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /