Skip to content

Commit 1904643

Browse files
committed
feat: add solutions to lc problem: No.2735
No.2735.Collecting Chocolates
1 parent 3532322 commit 1904643

File tree

7 files changed

+246
-56
lines changed

7 files changed

+246
-56
lines changed

.github/workflows/prettier.yml

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ on:
44
pull_request:
55
branches: [main]
66

7-
permissions: write-all
8-
97
jobs:
108
prettier:
119
runs-on: ubuntu-latest
@@ -15,6 +13,7 @@ jobs:
1513
uses: actions/checkout@v3
1614
with:
1715
ref: ${{ github.head_ref }}
16+
fetch-depth: 0
1817

1918
- name: Prettify code
2019
uses: creyD/prettier_action@v4.3

solution/2700-2799/2735.Collecting Chocolates/README.md

+88-32
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,27 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54-
### 方法1:暴力
54+
**方法一:枚举**
5555

56-
成本分为移动成本 + 收集成本
56+
我们考虑枚举操作的次数,定义 $f[i][j]$ 表示类型为 $i$ 的巧克力进行了 $j$ 次操作后的最小成本。那么有:
5757

58-
枚举最大移动次数`len`
58+
$$
59+
f[i][j] =
60+
\begin{cases}
61+
nums[i] ,& j = 0 \\
62+
\min(f[i][j - 1], nums[(i + j) \bmod n]) ,& j > 0
63+
\end{cases}
64+
$$
5965

60-
若移动次数为`len`,移动成本`= len * x`
66+
接下来,我们枚举操作的次数 $j$,其中 $j \in [0,..n-1]$,那么进行 $j$ 次操作的最小成本为:
6167

62-
对应下标为`i` 的巧克力,收集成本为`min[i][(i + len) % n]` ,其中`n` 为巧克力个数,`min[i][j]` 表示`nums[i-j]` 的最小值(可$$O(n^2)$$)预处理。
68+
$$
69+
\sum_{i=0}^{n-1} f[i][j] + j \times x
70+
$$
6371

64-
最终结果$$result = \sum_{i = 0}^{n - 1} min[i][(i + len)\mod n] + len * x$$
72+
我们取所有操作次数中的最小值即可。
6573

66-
67-
68-
时间复杂度:$$O(n^2)$$
69-
70-
空间复杂度:$$O(n^2)$$
74+
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是数组 $nums$ 的长度。
7175

7276
<!-- tabs:start -->
7377

@@ -76,7 +80,19 @@
7680
<!-- 这里可写当前语言的特殊实现逻辑 -->
7781

7882
```python
79-
83+
class Solution:
84+
def minCost(self, nums: List[int], x: int) -> int:
85+
n = len(nums)
86+
f = [[0] * n for _ in range(n)]
87+
for i, v in enumerate(nums):
88+
f[i][0] = v
89+
for j in range(1, n):
90+
f[i][j] = min(f[i][j - 1], nums[(i + j) % n])
91+
ans = inf
92+
for j in range(n):
93+
cost = sum(f[i][j] for i in range(n)) + x * j
94+
ans = min(ans, cost)
95+
return ans
8096
```
8197

8298
### **Java**
@@ -87,43 +103,83 @@
87103
class Solution {
88104
public long minCost(int[] nums, int x) {
89105
int n = nums.length;
90-
int[][] min = new int[n][n];
91-
for (int i = 0; i < n; i++) {
92-
int w = 0x3f3f3f3f;
93-
for (int j = i; j < n; j++) {
94-
w = Math.min(w, nums[j]);
95-
min[i][j] = w;
106+
int[][] f = new int[n][n];
107+
for (int i = 0; i < n; ++i) {
108+
f[i][0] = nums[i];
109+
for (int j = 1; j < n; ++j) {
110+
f[i][j] = Math.min(f[i][j - 1], nums[(i + j) % n]);
96111
}
97112
}
98-
99-
long res = Long.MAX_VALUE;
100-
for (int i = 0; i < n; i++) {
101-
long sum = 0;
102-
for (int j = 0; j < n; j++) {
103-
int l = j - i;
104-
if (l < 0) {
105-
sum += Math.min(min[0][j], min[n + l][n - 1]);
106-
} else {
107-
sum += min[l][j];
108-
}
113+
long ans = 1L << 60;
114+
for (int j = 0; j < n; ++j) {
115+
long cost = 1L * j * x;
116+
for (int i = 0; i < n; ++i) {
117+
cost += f[i][j];
109118
}
110-
res = Math.min(res, sum + x * 1L * i);
119+
ans = Math.min(ans, cost);
111120
}
112-
return res;
121+
return ans;
113122
}
114123
}
115124
```
116125

117126
### **C++**
118127

119128
```cpp
120-
129+
class Solution {
130+
public:
131+
long long minCost(vector<int>& nums, int x) {
132+
int n = nums.size();
133+
int f[n][n];
134+
for (int i = 0; i < n; ++i) {
135+
f[i][0] = nums[i];
136+
for (int j = 1; j < n; ++j) {
137+
f[i][j] = min(f[i][j - 1], nums[(i + j) % n]);
138+
}
139+
}
140+
long long ans = 1LL << 60;
141+
for (int j = 0; j < n; ++j) {
142+
long long cost = 1LL * j * x;
143+
for (int i = 0; i < n; ++i) {
144+
cost += f[i][j];
145+
}
146+
ans = min(ans, cost);
147+
}
148+
return ans;
149+
}
150+
};
121151
```
122152
123153
### **Go**
124154
125155
```go
156+
func minCost(nums []int, x int) int64 {
157+
n := len(nums)
158+
f := make([][]int, n)
159+
for i := range f {
160+
f[i] = make([]int, n)
161+
f[i][0] = nums[i]
162+
for j := 1; j < n; j++ {
163+
f[i][j] = min(f[i][j-1], nums[(i+j)%n])
164+
}
165+
}
166+
ans := 1 << 60
167+
for j := 0; j < n; j++ {
168+
cost := x * j
169+
for i := range nums {
170+
cost += f[i][j]
171+
}
172+
ans = min(ans, cost)
173+
}
174+
return int64(ans)
175+
}
126176
177+
func min(a, b int) int {
178+
if a < b {
179+
return a
180+
}
181+
return b
182+
}
127183
```
128184

129185
### **...**

solution/2700-2799/2735.Collecting Chocolates/README_EN.md

+83-4
Original file line numberDiff line numberDiff line change
@@ -50,25 +50,104 @@ Thus, the total cost will become (1 + 5 + 1 + 5 + 1) = 13. We can prove that thi
5050
### **Python3**
5151

5252
```python
53-
53+
class Solution:
54+
def minCost(self, nums: List[int], x: int) -> int:
55+
n = len(nums)
56+
f = [[0] * n for _ in range(n)]
57+
for i, v in enumerate(nums):
58+
f[i][0] = v
59+
for j in range(1, n):
60+
f[i][j] = min(f[i][j - 1], nums[(i + j) % n])
61+
ans = inf
62+
for j in range(n):
63+
cost = sum(f[i][j] for i in range(n)) + x * j
64+
ans = min(ans, cost)
65+
return ans
5466
```
5567

5668
### **Java**
5769

5870
```java
59-
71+
class Solution {
72+
public long minCost(int[] nums, int x) {
73+
int n = nums.length;
74+
int[][] f = new int[n][n];
75+
for (int i = 0; i < n; ++i) {
76+
f[i][0] = nums[i];
77+
for (int j = 1; j < n; ++j) {
78+
f[i][j] = Math.min(f[i][j - 1], nums[(i + j) % n]);
79+
}
80+
}
81+
long ans = 1L << 60;
82+
for (int j = 0; j < n; ++j) {
83+
long cost = 1L * j * x;
84+
for (int i = 0; i < n; ++i) {
85+
cost += f[i][j];
86+
}
87+
ans = Math.min(ans, cost);
88+
}
89+
return ans;
90+
}
91+
}
6092
```
6193

6294
### **C++**
6395

6496
```cpp
65-
97+
class Solution {
98+
public:
99+
long long minCost(vector<int>& nums, int x) {
100+
int n = nums.size();
101+
int f[n][n];
102+
for (int i = 0; i < n; ++i) {
103+
f[i][0] = nums[i];
104+
for (int j = 1; j < n; ++j) {
105+
f[i][j] = min(f[i][j - 1], nums[(i + j) % n]);
106+
}
107+
}
108+
long long ans = 1LL << 60;
109+
for (int j = 0; j < n; ++j) {
110+
long long cost = 1LL * j * x;
111+
for (int i = 0; i < n; ++i) {
112+
cost += f[i][j];
113+
}
114+
ans = min(ans, cost);
115+
}
116+
return ans;
117+
}
118+
};
66119
```
67120
68121
### **Go**
69122
70123
```go
71-
124+
func minCost(nums []int, x int) int64 {
125+
n := len(nums)
126+
f := make([][]int, n)
127+
for i := range f {
128+
f[i] = make([]int, n)
129+
f[i][0] = nums[i]
130+
for j := 1; j < n; j++ {
131+
f[i][j] = min(f[i][j-1], nums[(i+j)%n])
132+
}
133+
}
134+
ans := 1 << 60
135+
for j := 0; j < n; j++ {
136+
cost := x * j
137+
for i := range nums {
138+
cost += f[i][j]
139+
}
140+
ans = min(ans, cost)
141+
}
142+
return int64(ans)
143+
}
144+
145+
func min(a, b int) int {
146+
if a < b {
147+
return a
148+
}
149+
return b
150+
}
72151
```
73152

74153
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
long long minCost(vector<int>& nums, int x) {
4+
int n = nums.size();
5+
int f[n][n];
6+
for (int i = 0; i < n; ++i) {
7+
f[i][0] = nums[i];
8+
for (int j = 1; j < n; ++j) {
9+
f[i][j] = min(f[i][j - 1], nums[(i + j) % n]);
10+
}
11+
}
12+
long long ans = 1LL << 60;
13+
for (int j = 0; j < n; ++j) {
14+
long long cost = 1LL * j * x;
15+
for (int i = 0; i < n; ++i) {
16+
cost += f[i][j];
17+
}
18+
ans = min(ans, cost);
19+
}
20+
return ans;
21+
}
22+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
func minCost(nums []int, x int) int64 {
2+
n := len(nums)
3+
f := make([][]int, n)
4+
for i := range f {
5+
f[i] = make([]int, n)
6+
f[i][0] = nums[i]
7+
for j := 1; j < n; j++ {
8+
f[i][j] = min(f[i][j-1], nums[(i+j)%n])
9+
}
10+
}
11+
ans := 1 << 60
12+
for j := 0; j < n; j++ {
13+
cost := x * j
14+
for i := range nums {
15+
cost += f[i][j]
16+
}
17+
ans = min(ans, cost)
18+
}
19+
return int64(ans)
20+
}
21+
22+
func min(a, b int) int {
23+
if a < b {
24+
return a
25+
}
26+
return b
27+
}
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
11
class Solution {
22
public long minCost(int[] nums, int x) {
33
int n = nums.length;
4-
int[][] min = new int[n][n];
5-
for (int i = 0; i < n; i++) {
6-
int w = 0x3f3f3f3f;
7-
for (int j = i; j < n; j++) {
8-
w = Math.min(w, nums[j]);
9-
min[i][j] = w;
4+
int[][] f = new int[n][n];
5+
for (int i = 0; i < n; ++i) {
6+
f[i][0] = nums[i];
7+
for (int j = 1; j < n; ++j) {
8+
f[i][j] = Math.min(f[i][j - 1], nums[(i + j) % n]);
109
}
1110
}
12-
long res = Long.MAX_VALUE;
13-
for (int i = 0; i < n; i++) {
14-
long sum = 0;
15-
for (int j = 0; j < n; j++) {
16-
int l = j - i;
17-
if (l < 0) {
18-
sum += Math.min(min[0][j], min[n + l][n - 1]);
19-
} else {
20-
sum += min[l][j];
21-
}
11+
long ans = 1L << 60;
12+
for (int j = 0; j < n; ++j) {
13+
long cost = 1L * j * x;
14+
for (int i = 0; i < n; ++i) {
15+
cost += f[i][j];
2216
}
23-
res = Math.min(res, sum + x * 1L * i);
17+
ans = Math.min(ans, cost);
2418
}
25-
return res;
19+
return ans;
2620
}
2721
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def minCost(self, nums: List[int], x: int) -> int:
3+
n = len(nums)
4+
f = [[0] * n for _ in range(n)]
5+
for i, v in enumerate(nums):
6+
f[i][0] = v
7+
for j in range(1, n):
8+
f[i][j] = min(f[i][j - 1], nums[(i + j) % n])
9+
ans = inf
10+
for j in range(n):
11+
cost = sum(f[i][j] for i in range(n)) + x * j
12+
ans = min(ans, cost)
13+
return ans

0 commit comments

Comments
 (0)