Skip to content

Commit 9809e29

Browse files
committed
feat: add solutions to lcp problem: No.72
LCP 72.补给马车
1 parent 855c1c7 commit 9809e29

File tree

6 files changed

+288
-11
lines changed

6 files changed

+288
-11
lines changed

lcp/LCP 72. 补给马车/README.md

+161-11
Original file line numberDiff line numberDiff line change
@@ -6,51 +6,201 @@
66

77
远征队即将开启未知的冒险之旅,不过在此之前,将对补给车队进行最后的检查。`supplies[i]` 表示编号为 `i` 的补给马车装载的物资数量。
88
考虑到车队过长容易被野兽偷袭,他们决定将车队的长度变为原来的一半(向下取整),计划为:
9-
- 找出车队中 **物资之和最小** 两辆 **相邻** 马车,将它们车辆的物资整合为一辆。若存在多组物资之和相同的马车,则取编号最小的两辆马车进行整合;
10-
- 重复上述操作直到车队长度符合要求。
9+
10+
- 找出车队中 **物资之和最小** 两辆 **相邻** 马车,将它们车辆的物资整合为一辆。若存在多组物资之和相同的马车,则取编号最小的两辆马车进行整合;
11+
- 重复上述操作直到车队长度符合要求。
1112

1213
请返回车队长度符合要求后,物资的分布情况。
1314

1415
**示例 1:**
15-
>输入:`supplies = [7,3,6,1,8]`
16+
17+
> 输入:`supplies = [7,3,6,1,8]`
1618
>
17-
>输出:`[10,15]`
19+
> 输出:`[10,15]`
1820
>
19-
>解释:
21+
> 解释:
2022
> 第 1 次合并,符合条件的两辆马车为 6,1,合并后的车队为 [7,3,7,8]
2123
> 第 2 次合并,符合条件的两辆马车为 (7,3) 和 (3,7),取编号最小的 (7,3),合并后的车队为 [10,7,8]
2224
> 第 3 次合并,符合条件的两辆马车为 7,8,合并后的车队为 [10,15]
23-
>返回 `[10,15]`
25+
> 返回 `[10,15]`
2426
2527
**示例 2:**
26-
>输入:`supplies = [1,3,1,5]`
28+
29+
> 输入:`supplies = [1,3,1,5]`
2730
>
28-
>输出:`[5,5]`
31+
> 输出:`[5,5]`
2932
3033
**解释:**
31-
- `2 <= supplies.length <= 1000`
32-
- `1 <= supplies[i] <= 1000`
34+
35+
- `2 <= supplies.length <= 1000`
36+
- `1 <= supplies[i] <= 1000`
3337

3438
## 解法
3539

3640
<!-- 这里可写通用的实现逻辑 -->
3741

42+
**方法一:模拟**
43+
44+
根据题目描述,我们每次遍历 `supplies`,找到物资之和最小的两辆相邻马车,将它们车辆的物资整合为一辆,重复上述操作直到车队长度符合要求。
45+
46+
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为 `supplies` 的长度。
47+
3848
<!-- tabs:start -->
3949

4050
### **Python3**
4151

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

4454
```python
45-
55+
class Solution:
56+
def supplyWagon(self, supplies: List[int]) -> List[int]:
57+
for _ in range((len(supplies) + 1) >> 1):
58+
n = len(supplies)
59+
mi = inf
60+
k = 0
61+
for i in range(n - 1):
62+
x = supplies[i] + supplies[i + 1]
63+
if mi > x:
64+
mi = x
65+
k = i
66+
t = []
67+
i = 0
68+
while i < n:
69+
if i == k:
70+
t.append(mi)
71+
i += 2
72+
else:
73+
t.append(supplies[i])
74+
i += 1
75+
supplies = t
76+
return supplies
4677
```
4778

4879
### **Java**
4980

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

5283
```java
84+
class Solution {
85+
public int[] supplyWagon(int[] supplies) {
86+
for (int h = (supplies.length + 1) >> 1; h > 0; --h) {
87+
int n = supplies.length;
88+
int mi = 1 << 30;
89+
int k = 0;
90+
for (int i = 0; i < n - 1; ++i) {
91+
int x = supplies[i] + supplies[i + 1];
92+
if (mi > x) {
93+
mi = x;
94+
k = i;
95+
}
96+
}
97+
int[] t = new int[n - 1];
98+
for (int i = 0, j = 0; i < n; ++i, ++j) {
99+
if (i == k) {
100+
t[j] = mi;
101+
++i;
102+
} else {
103+
t[j] = supplies[i];
104+
}
105+
}
106+
supplies = t;
107+
}
108+
return supplies;
109+
}
110+
}
111+
```
112+
113+
### **C++**
114+
115+
```cpp
116+
class Solution {
117+
public:
118+
vector<int> supplyWagon(vector<int>& supplies) {
119+
for (int h = (supplies.size() + 1) >> 1; h; --h) {
120+
int n = supplies.size();
121+
int mi = 1 << 30;
122+
int k = 0;
123+
for (int i = 0; i < n - 1; ++i) {
124+
int x = supplies[i] + supplies[i + 1];
125+
if (mi > x) {
126+
mi = x;
127+
k = i;
128+
}
129+
}
130+
vector<int> t(n - 1);
131+
for (int i = 0, j = 0; i < n; ++i, ++j) {
132+
if (i == k) {
133+
t[j] = mi;
134+
++i;
135+
} else {
136+
t[j] = supplies[i];
137+
}
138+
}
139+
supplies = move(t);
140+
}
141+
return supplies;
142+
}
143+
};
144+
```
145+
146+
### **Go**
147+
148+
```go
149+
func supplyWagon(supplies []int) []int {
150+
for h := (len(supplies) + 1) >> 1; h > 0; h-- {
151+
n := len(supplies)
152+
mi := 1 << 30
153+
k := 0
154+
for i := 0; i < n-1; i++ {
155+
x := supplies[i] + supplies[i+1]
156+
if mi > x {
157+
mi = x
158+
k = i
159+
}
160+
}
161+
t := make([]int, n-1)
162+
for i, j := 0, 0; i < n; i, j = i+1, j+1 {
163+
if i == k {
164+
t[j] = mi
165+
i++
166+
} else {
167+
t[j] = supplies[i]
168+
}
169+
}
170+
supplies = t
171+
}
172+
return supplies
173+
}
174+
```
53175

176+
### **TypeScript**
177+
178+
```ts
179+
function supplyWagon(supplies: number[]): number[] {
180+
for (let h = (supplies.length + 1) >> 1; h > 0; --h) {
181+
const n = supplies.length;
182+
let mi = 1 << 30;
183+
let k = 0;
184+
for (let i = 0; i < n - 1; ++i) {
185+
const x = supplies[i] + supplies[i + 1];
186+
if (mi > x) {
187+
mi = x;
188+
k = i;
189+
}
190+
}
191+
const t: number[] = new Array(n - 1);
192+
for (let i = 0, j = 0; i < n; ++i, ++j) {
193+
if (i === k) {
194+
t[j] = mi;
195+
++i;
196+
} else {
197+
t[j] = supplies[i];
198+
}
199+
}
200+
supplies = t;
201+
}
202+
return supplies;
203+
}
54204
```
55205

56206
### **...**

lcp/LCP 72. 补给马车/Solution.cpp

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public:
3+
vector<int> supplyWagon(vector<int>& supplies) {
4+
for (int h = (supplies.size() + 1) >> 1; h; --h) {
5+
int n = supplies.size();
6+
int mi = 1 << 30;
7+
int k = 0;
8+
for (int i = 0; i < n - 1; ++i) {
9+
int x = supplies[i] + supplies[i + 1];
10+
if (mi > x) {
11+
mi = x;
12+
k = i;
13+
}
14+
}
15+
vector<int> t(n - 1);
16+
for (int i = 0, j = 0; i < n; ++i, ++j) {
17+
if (i == k) {
18+
t[j] = mi;
19+
++i;
20+
} else {
21+
t[j] = supplies[i];
22+
}
23+
}
24+
supplies = move(t);
25+
}
26+
return supplies;
27+
}
28+
};

lcp/LCP 72. 补给马车/Solution.go

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
func supplyWagon(supplies []int) []int {
2+
for h := (len(supplies) + 1) >> 1; h > 0; h-- {
3+
n := len(supplies)
4+
mi := 1 << 30
5+
k := 0
6+
for i := 0; i < n-1; i++ {
7+
x := supplies[i] + supplies[i+1]
8+
if mi > x {
9+
mi = x
10+
k = i
11+
}
12+
}
13+
t := make([]int, n-1)
14+
for i, j := 0, 0; i < n; i, j = i+1, j+1 {
15+
if i == k {
16+
t[j] = mi
17+
i++
18+
} else {
19+
t[j] = supplies[i]
20+
}
21+
}
22+
supplies = t
23+
}
24+
return supplies
25+
}
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public int[] supplyWagon(int[] supplies) {
3+
for (int h = (supplies.length + 1) >> 1; h > 0; --h) {
4+
int n = supplies.length;
5+
int mi = 1 << 30;
6+
int k = 0;
7+
for (int i = 0; i < n - 1; ++i) {
8+
int x = supplies[i] + supplies[i + 1];
9+
if (mi > x) {
10+
mi = x;
11+
k = i;
12+
}
13+
}
14+
int[] t = new int[n - 1];
15+
for (int i = 0, j = 0; i < n; ++i, ++j) {
16+
if (i == k) {
17+
t[j] = mi;
18+
++i;
19+
} else {
20+
t[j] = supplies[i];
21+
}
22+
}
23+
supplies = t;
24+
}
25+
return supplies;
26+
}
27+
}

lcp/LCP 72. 补给马车/Solution.py

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution:
2+
def supplyWagon(self, supplies: List[int]) -> List[int]:
3+
for _ in range((len(supplies) + 1) >> 1):
4+
n = len(supplies)
5+
mi = inf
6+
k = 0
7+
for i in range(n - 1):
8+
x = supplies[i] + supplies[i + 1]
9+
if mi > x:
10+
mi = x
11+
k = i
12+
t = []
13+
i = 0
14+
while i < n:
15+
if i == k:
16+
t.append(mi)
17+
i += 2
18+
else:
19+
t.append(supplies[i])
20+
i += 1
21+
supplies = t
22+
return supplies

lcp/LCP 72. 补给马车/Solution.ts

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
function supplyWagon(supplies: number[]): number[] {
2+
for (let h = (supplies.length + 1) >> 1; h > 0; --h) {
3+
const n = supplies.length;
4+
let mi = 1 << 30;
5+
let k = 0;
6+
for (let i = 0; i < n - 1; ++i) {
7+
const x = supplies[i] + supplies[i + 1];
8+
if (mi > x) {
9+
mi = x;
10+
k = i;
11+
}
12+
}
13+
const t: number[] = new Array(n - 1);
14+
for (let i = 0, j = 0; i < n; ++i, ++j) {
15+
if (i === k) {
16+
t[j] = mi;
17+
++i;
18+
} else {
19+
t[j] = supplies[i];
20+
}
21+
}
22+
supplies = t;
23+
}
24+
return supplies;
25+
}

0 commit comments

Comments
 (0)