Skip to content

Commit 08c610b

Browse files
committed
feat: add solutions to lc problem: No.1066
No.1066.Campus Bikes II
1 parent 7be4a75 commit 08c610b

File tree

7 files changed

+393
-2
lines changed

7 files changed

+393
-2
lines changed

solution/1000-1099/1066.Campus Bikes II/README.md

Lines changed: 144 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,165 @@
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66+
**方法一:状态压缩动态规划**
67+
68+
我们定义 $f[i][j]$ 表示前 $i$ 个工人分配到自行车的状态为 $j$ 时的最小曼哈顿距离总和,其中 $j$ 是一个二进制数,表示自行车的分配情况。初始时 $f[0][0]=0$,其余 $f[0][j]=+\infty$。
69+
70+
考虑 $f[i][j]$,我们枚举第 $i$ 个工人分配到的自行车的编号 $k$,那么 $f[i][j]$ 可以从 $f[i-1][j\oplus 2^k]$ 转移而来,其中 $\oplus$ 表示异或运算。这是因为 $f[i-1][j\oplus 2^k]$ 表示前 $i-1$ 个工人分配到自行车的状态为 $j\oplus 2^k$ 时的最小曼哈顿距离总和,而第 $i$ 个工人分配到自行车 $k$ 时,其曼哈顿距离为 $|worker[i]-bike[k]|$,其中 $|x|$ 表示 $x$ 的绝对值。因此我们可以列出状态转移方程:
71+
72+
$$
73+
f[i][j]=\min_{k=0}^{m-1}\{f[i-1][j\oplus 2^k]+|worker[i]-bike[k]|\}
74+
$$
75+
76+
最终的答案为 $\min_{j=0}^{2^m-1}\{f[n][j]\}$。
77+
78+
时间复杂度 $O(n \times 2^m \times m)$,空间复杂度 $O(n \times 2^m)$。其中 $n$ 和 $m$ 分别是工人和自行车的数量。
79+
6680
<!-- tabs:start -->
6781

6882
### **Python3**
6983

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

7286
```python
73-
87+
class Solution:
88+
def assignBikes(self, workers: List[List[int]], bikes: List[List[int]]) -> int:
89+
n, m = len(workers), len(bikes)
90+
f = [[inf] * (1 << m) for _ in range(n + 1)]
91+
f[0][0] = 0
92+
for i, (x1, y1) in enumerate(workers, 1):
93+
for j in range(1 << m):
94+
for k, (x2, y2) in enumerate(bikes):
95+
if j >> k & 1:
96+
f[i][j] = min(f[i][j], f[i - 1][j ^ (1 << k)] + abs(x1 - x2) + abs(y1 - y2))
97+
return min(f[n])
7498
```
7599

76100
### **Java**
77101

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

80104
```java
105+
class Solution {
106+
public int assignBikes(int[][] workers, int[][] bikes) {
107+
int n = workers.length;
108+
int m = bikes.length;
109+
int[][] f = new int[n + 1][1 << m];
110+
for (var g : f) {
111+
Arrays.fill(g, 1 << 30);
112+
}
113+
f[0][0] = 0;
114+
for (int i = 1; i <= n; ++i) {
115+
for (int j = 0; j < 1 << m; ++j) {
116+
for (int k = 0; k < m; ++k) {
117+
if ((j >> k & 1) == 1) {
118+
int d = Math.abs(workers[i - 1][0] - bikes[k][0]) + Math.abs(workers[i - 1][1] - bikes[k][1]);
119+
f[i][j] = Math.min(f[i][j], f[i - 1][j ^ (1 << k)] + d);
120+
}
121+
}
122+
}
123+
}
124+
return Arrays.stream(f[n]).min().getAsInt();
125+
}
126+
}
127+
```
128+
129+
### **C++**
130+
131+
```cpp
132+
class Solution {
133+
public:
134+
int assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
135+
int n = workers.size(), m = bikes.size();
136+
int f[n + 1][1 << m];
137+
memset(f, 0x3f, sizeof(f));
138+
f[0][0] = 0;
139+
for (int i = 1; i <= n; ++i) {
140+
for (int j = 0; j < 1 << m; ++j) {
141+
for (int k = 0; k < m; ++k) {
142+
if (j >> k & 1) {
143+
int d = abs(workers[i - 1][0] - bikes[k][0]) + abs(workers[i - 1][1] - bikes[k][1]);
144+
f[i][j] = min(f[i][j], f[i - 1][j ^ (1 << k)] + d);
145+
}
146+
}
147+
}
148+
}
149+
return *min_element(f[n], f[n] + (1 << m));
150+
}
151+
};
152+
```
153+
154+
### **Go**
155+
156+
```go
157+
func assignBikes(workers [][]int, bikes [][]int) int {
158+
n, m := len(workers), len(bikes)
159+
f := make([][]int, n+1)
160+
const inf = 1 << 30
161+
for i := range f {
162+
f[i] = make([]int, 1<<m)
163+
for j := range f[i] {
164+
f[i][j] = inf
165+
}
166+
}
167+
f[0][0] = 0
168+
for i := 1; i <= n; i++ {
169+
for j := 0; j < 1<<m; j++ {
170+
for k := 0; k < m; k++ {
171+
if j>>k&1 == 1 {
172+
d := abs(workers[i-1][0]-bikes[k][0]) + abs(workers[i-1][1]-bikes[k][1])
173+
f[i][j] = min(f[i][j], f[i-1][j^(1<<k)]+d)
174+
}
175+
}
176+
}
177+
}
178+
ans := inf
179+
for _, x := range f[n] {
180+
ans = min(ans, x)
181+
}
182+
return ans
183+
}
184+
185+
func min(a, b int) int {
186+
if a < b {
187+
return a
188+
}
189+
return b
190+
}
191+
192+
func abs(x int) int {
193+
if x < 0 {
194+
return -x
195+
}
196+
return x
197+
}
198+
```
81199

200+
### **TypeScript**
201+
202+
```ts
203+
function assignBikes(workers: number[][], bikes: number[][]): number {
204+
const n = workers.length;
205+
const m = bikes.length;
206+
const inf = 1 << 30;
207+
const f: number[][] = new Array(n + 1)
208+
.fill(0)
209+
.map(() => new Array(1 << m).fill(inf));
210+
f[0][0] = 0;
211+
for (let i = 1; i <= n; ++i) {
212+
for (let j = 0; j < 1 << m; ++j) {
213+
for (let k = 0; k < m; ++k) {
214+
if (((j >> k) & 1) === 1) {
215+
const d =
216+
Math.abs(workers[i - 1][0] - bikes[k][0]) +
217+
Math.abs(workers[i - 1][1] - bikes[k][1]);
218+
f[i][j] = Math.min(f[i][j], f[i - 1][j ^ (1 << k)] + d);
219+
}
220+
}
221+
}
222+
}
223+
return Math.min(...f[n]);
224+
}
82225
```
83226

84227
### **...**

solution/1000-1099/1066.Campus Bikes II/README_EN.md

Lines changed: 130 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,142 @@ We first assign bike 0 to worker 0, then assign bike 1 to worker 1 or worker 2,
5858
### **Python3**
5959

6060
```python
61-
61+
class Solution:
62+
def assignBikes(self, workers: List[List[int]], bikes: List[List[int]]) -> int:
63+
n, m = len(workers), len(bikes)
64+
f = [[inf] * (1 << m) for _ in range(n + 1)]
65+
f[0][0] = 0
66+
for i, (x1, y1) in enumerate(workers, 1):
67+
for j in range(1 << m):
68+
for k, (x2, y2) in enumerate(bikes):
69+
if j >> k & 1:
70+
f[i][j] = min(f[i][j], f[i - 1][j ^ (1 << k)] + abs(x1 - x2) + abs(y1 - y2))
71+
return min(f[n])
6272
```
6373

6474
### **Java**
6575

6676
```java
77+
class Solution {
78+
public int assignBikes(int[][] workers, int[][] bikes) {
79+
int n = workers.length;
80+
int m = bikes.length;
81+
int[][] f = new int[n + 1][1 << m];
82+
for (var g : f) {
83+
Arrays.fill(g, 1 << 30);
84+
}
85+
f[0][0] = 0;
86+
for (int i = 1; i <= n; ++i) {
87+
for (int j = 0; j < 1 << m; ++j) {
88+
for (int k = 0; k < m; ++k) {
89+
if ((j >> k & 1) == 1) {
90+
int d = Math.abs(workers[i - 1][0] - bikes[k][0]) + Math.abs(workers[i - 1][1] - bikes[k][1]);
91+
f[i][j] = Math.min(f[i][j], f[i - 1][j ^ (1 << k)] + d);
92+
}
93+
}
94+
}
95+
}
96+
return Arrays.stream(f[n]).min().getAsInt();
97+
}
98+
}
99+
```
100+
101+
### **C++**
102+
103+
```cpp
104+
class Solution {
105+
public:
106+
int assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
107+
int n = workers.size(), m = bikes.size();
108+
int f[n + 1][1 << m];
109+
memset(f, 0x3f, sizeof(f));
110+
f[0][0] = 0;
111+
for (int i = 1; i <= n; ++i) {
112+
for (int j = 0; j < 1 << m; ++j) {
113+
for (int k = 0; k < m; ++k) {
114+
if (j >> k & 1) {
115+
int d = abs(workers[i - 1][0] - bikes[k][0]) + abs(workers[i - 1][1] - bikes[k][1]);
116+
f[i][j] = min(f[i][j], f[i - 1][j ^ (1 << k)] + d);
117+
}
118+
}
119+
}
120+
}
121+
return *min_element(f[n], f[n] + (1 << m));
122+
}
123+
};
124+
```
125+
126+
### **Go**
127+
128+
```go
129+
func assignBikes(workers [][]int, bikes [][]int) int {
130+
n, m := len(workers), len(bikes)
131+
f := make([][]int, n+1)
132+
const inf = 1 << 30
133+
for i := range f {
134+
f[i] = make([]int, 1<<m)
135+
for j := range f[i] {
136+
f[i][j] = inf
137+
}
138+
}
139+
f[0][0] = 0
140+
for i := 1; i <= n; i++ {
141+
for j := 0; j < 1<<m; j++ {
142+
for k := 0; k < m; k++ {
143+
if j>>k&1 == 1 {
144+
d := abs(workers[i-1][0]-bikes[k][0]) + abs(workers[i-1][1]-bikes[k][1])
145+
f[i][j] = min(f[i][j], f[i-1][j^(1<<k)]+d)
146+
}
147+
}
148+
}
149+
}
150+
ans := inf
151+
for _, x := range f[n] {
152+
ans = min(ans, x)
153+
}
154+
return ans
155+
}
156+
157+
func min(a, b int) int {
158+
if a < b {
159+
return a
160+
}
161+
return b
162+
}
163+
164+
func abs(x int) int {
165+
if x < 0 {
166+
return -x
167+
}
168+
return x
169+
}
170+
```
67171

172+
### **TypeScript**
173+
174+
```ts
175+
function assignBikes(workers: number[][], bikes: number[][]): number {
176+
const n = workers.length;
177+
const m = bikes.length;
178+
const inf = 1 << 30;
179+
const f: number[][] = new Array(n + 1)
180+
.fill(0)
181+
.map(() => new Array(1 << m).fill(inf));
182+
f[0][0] = 0;
183+
for (let i = 1; i <= n; ++i) {
184+
for (let j = 0; j < 1 << m; ++j) {
185+
for (let k = 0; k < m; ++k) {
186+
if (((j >> k) & 1) === 1) {
187+
const d =
188+
Math.abs(workers[i - 1][0] - bikes[k][0]) +
189+
Math.abs(workers[i - 1][1] - bikes[k][1]);
190+
f[i][j] = Math.min(f[i][j], f[i - 1][j ^ (1 << k)] + d);
191+
}
192+
}
193+
}
194+
}
195+
return Math.min(...f[n]);
196+
}
68197
```
69198

70199
### **...**
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
4+
int n = workers.size(), m = bikes.size();
5+
int f[n + 1][1 << m];
6+
memset(f, 0x3f, sizeof(f));
7+
f[0][0] = 0;
8+
for (int i = 1; i <= n; ++i) {
9+
for (int j = 0; j < 1 << m; ++j) {
10+
for (int k = 0; k < m; ++k) {
11+
if (j >> k & 1) {
12+
int d = abs(workers[i - 1][0] - bikes[k][0]) + abs(workers[i - 1][1] - bikes[k][1]);
13+
f[i][j] = min(f[i][j], f[i - 1][j ^ (1 << k)] + d);
14+
}
15+
}
16+
}
17+
}
18+
return *min_element(f[n], f[n] + (1 << m));
19+
}
20+
};
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
func assignBikes(workers [][]int, bikes [][]int) int {
2+
n, m := len(workers), len(bikes)
3+
f := make([][]int, n+1)
4+
const inf = 1 << 30
5+
for i := range f {
6+
f[i] = make([]int, 1<<m)
7+
for j := range f[i] {
8+
f[i][j] = inf
9+
}
10+
}
11+
f[0][0] = 0
12+
for i := 1; i <= n; i++ {
13+
for j := 0; j < 1<<m; j++ {
14+
for k := 0; k < m; k++ {
15+
if j>>k&1 == 1 {
16+
d := abs(workers[i-1][0]-bikes[k][0]) + abs(workers[i-1][1]-bikes[k][1])
17+
f[i][j] = min(f[i][j], f[i-1][j^(1<<k)]+d)
18+
}
19+
}
20+
}
21+
}
22+
ans := inf
23+
for _, x := range f[n] {
24+
ans = min(ans, x)
25+
}
26+
return ans
27+
}
28+
29+
func min(a, b int) int {
30+
if a < b {
31+
return a
32+
}
33+
return b
34+
}
35+
36+
func abs(x int) int {
37+
if x < 0 {
38+
return -x
39+
}
40+
return x
41+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int assignBikes(int[][] workers, int[][] bikes) {
3+
int n = workers.length;
4+
int m = bikes.length;
5+
int[][] f = new int[n + 1][1 << m];
6+
for (var g : f) {
7+
Arrays.fill(g, 1 << 30);
8+
}
9+
f[0][0] = 0;
10+
for (int i = 1; i <= n; ++i) {
11+
for (int j = 0; j < 1 << m; ++j) {
12+
for (int k = 0; k < m; ++k) {
13+
if ((j >> k & 1) == 1) {
14+
int d = Math.abs(workers[i - 1][0] - bikes[k][0]) + Math.abs(workers[i - 1][1] - bikes[k][1]);
15+
f[i][j] = Math.min(f[i][j], f[i - 1][j ^ (1 << k)] + d);
16+
}
17+
}
18+
}
19+
}
20+
return Arrays.stream(f[n]).min().getAsInt();
21+
}
22+
}

0 commit comments

Comments
 (0)