Skip to content

Commit 83ebc1b

Browse files
committed
feat: update solutions to lc problem: No.0813
No.0813.Largest Sum of Averages
1 parent d743a81 commit 83ebc1b

File tree

9 files changed

+75
-141
lines changed

9 files changed

+75
-141
lines changed

solution/0800-0899/0813.Largest Sum of Averages/README.md

Lines changed: 26 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,17 @@ nums 的最优分组是[9], [1, 2, 3], [9]. 得到的分数是 9 + (1 + 2 + 3) /
4848

4949
**方法一:记忆化搜索**
5050

51-
定义 $n$ 表示数组 `nums` 的长度。
52-
53-
我们设计函数 $dfs(i, k)$,表示从数组下标 $i$ 开始,最多分成 $k$ 组的最大平均值和。答案为 $dfs(0, k)$。
51+
我们设计一个函数 $dfs(i, k)$,表示从数组下标 $i$ 开始,最多分成 $k$ 组的最大平均值和。答案为 $dfs(0, k)$。函数 $dfs(i, k)$ 的执行逻辑如下:
5452

5553
当 $i=n$ 时,表示已经遍历到数组末尾,此时返回 $0$。
5654

5755
当 $k=1$ 时,表示只剩下一组,此时返回从下标 $i$ 开始到数组末尾的平均值。
5856

59-
否则,我们在 $[i, ..n-1]$ 的范围内枚举分组的结束位置 $j$,计算从下标 $i$ 到下标 $j$ 的平均值,以及从下标 $j+1$ 开始,最多分成 $k-1$ 组的最大平均值和,取二者之和的最大值
57+
否则,我们在 $[i, ..n-1]$ 的范围内枚举分组的结束位置 $j$,计算从下标 $i$ 到下标 $j$ 的平均值,以及从下标 $j+1$ 开始,最多分成 $k-1$ 组的最大平均值和。取其中的最大值作为答案
6058

61-
为了避免重复计算,我们用数组 $f$ 记忆化函数 $dfs(i, k)$ 的返回值。
59+
为了避免重复计算,我们可以用数组 $f$ 记忆化函数 $dfs(i, k)$ 的返回值。
6260

63-
时间复杂度 $O(n^2\times k)$。其中 $n$ 表示数组 `nums` 的长度。
61+
时间复杂度 $O(n^2 \times k)$,空间复杂度 $O(n \times k)$。其中 $n$ 表示数组 `nums` 的长度。
6462

6563
<!-- tabs:start -->
6664

@@ -94,17 +92,14 @@ class Solution:
9492

9593
```java
9694
class Solution {
97-
private double[][] f;
95+
private Double[][] f;
9896
private int[] s;
9997
private int n;
10098

10199
public double largestSumOfAverages(int[] nums, int k) {
102100
n = nums.length;
103101
s = new int[n + 1];
104-
f = new double[n + 1][k + 1];
105-
for (var e : f) {
106-
Arrays.fill(e, -1);
107-
}
102+
f = new Double[n + 1][k + 1];
108103
for (int i = 0; i < n; ++i) {
109104
s[i + 1] = s[i] + nums[i];
110105
}
@@ -118,16 +113,15 @@ class Solution {
118113
if (k == 1) {
119114
return (s[n] - s[i]) * 1.0 / (n - i);
120115
}
121-
if (f[i][k] >= 0) {
116+
if (f[i][k] != null) {
122117
return f[i][k];
123118
}
124119
double ans = 0;
125120
for (int j = i; j < n; ++j) {
126121
double t = (s[j + 1] - s[i]) * 1.0 / (j - i + 1) + dfs(j + 1, k - 1);
127122
ans = Math.max(ans, t);
128123
}
129-
f[i][k] = ans;
130-
return ans;
124+
return f[i][k] = ans;
131125
}
132126
}
133127
```
@@ -137,38 +131,26 @@ class Solution {
137131
```cpp
138132
class Solution {
139133
public:
140-
double f[110][110];
141-
int s[110];
142-
int n;
143-
144134
double largestSumOfAverages(vector<int>& nums, int k) {
145-
n = nums.size();
135+
int n = nums.size();
136+
int s[n + 1];
137+
double f[n][k + 1];
146138
s[0] = 0;
147-
for (int i = 0; i < n; ++i) {
148-
s[i + 1] = s[i] + nums[i];
149-
}
150-
memset(f, -1, sizeof f);
139+
memset(f, 0, sizeof f);
140+
for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i];
141+
function<double(int, int)> dfs = [&](int i, int k) -> double {
142+
if (i == n) return 0;
143+
if (k == 1) return (s[n] - s[i]) * 1.0 / (n - i);
144+
if (f[i][k]) return f[i][k];
145+
double ans = 0;
146+
for (int j = i; j < n; ++j) {
147+
double t = (s[j + 1] - s[i]) * 1.0 / (j - i + 1) + dfs(j + 1, k - 1);
148+
ans = max(ans, t);
149+
}
150+
return f[i][k] = ans;
151+
};
151152
return dfs(0, k);
152153
}
153-
154-
double dfs(int i, int k) {
155-
if (i == n) {
156-
return 0;
157-
}
158-
if (k == 1) {
159-
return (s[n] - s[i]) * 1.0 / (n - i);
160-
}
161-
if (f[i][k] >= 0) {
162-
return f[i][k];
163-
}
164-
double ans = 0;
165-
for (int j = i; j < n; ++j) {
166-
double t = (s[j + 1] - s[i]) * 1.0 / (j - i + 1) + dfs(j + 1, k - 1);
167-
ans = max(ans, t);
168-
}
169-
f[i][k] = ans;
170-
return ans;
171-
}
172154
};
173155
```
174156
@@ -178,13 +160,7 @@ public:
178160
func largestSumOfAverages(nums []int, k int) float64 {
179161
n := len(nums)
180162
s := make([]int, n+1)
181-
f := make([][]float64, n+1)
182-
for i := range f {
183-
f[i] = make([]float64, k+1)
184-
for j := range f[i] {
185-
f[i][j] = -1
186-
}
187-
}
163+
f := [110][110]float64{}
188164
for i, v := range nums {
189165
s[i+1] = s[i] + v
190166
}
@@ -196,7 +172,7 @@ func largestSumOfAverages(nums []int, k int) float64 {
196172
if k == 1 {
197173
return float64(s[n]-s[i]) / float64(n-i)
198174
}
199-
if f[i][k] >= 0 {
175+
if f[i][k] > 0 {
200176
return f[i][k]
201177
}
202178
var ans float64

solution/0800-0899/0813.Largest Sum of Averages/README_EN.md

Lines changed: 22 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,14 @@ class Solution:
6868

6969
```java
7070
class Solution {
71-
private double[][] f;
71+
private Double[][] f;
7272
private int[] s;
7373
private int n;
7474

7575
public double largestSumOfAverages(int[] nums, int k) {
7676
n = nums.length;
7777
s = new int[n + 1];
78-
f = new double[n + 1][k + 1];
79-
for (var e : f) {
80-
Arrays.fill(e, -1);
81-
}
78+
f = new Double[n + 1][k + 1];
8279
for (int i = 0; i < n; ++i) {
8380
s[i + 1] = s[i] + nums[i];
8481
}
@@ -92,16 +89,15 @@ class Solution {
9289
if (k == 1) {
9390
return (s[n] - s[i]) * 1.0 / (n - i);
9491
}
95-
if (f[i][k] >= 0) {
92+
if (f[i][k] != null) {
9693
return f[i][k];
9794
}
9895
double ans = 0;
9996
for (int j = i; j < n; ++j) {
10097
double t = (s[j + 1] - s[i]) * 1.0 / (j - i + 1) + dfs(j + 1, k - 1);
10198
ans = Math.max(ans, t);
10299
}
103-
f[i][k] = ans;
104-
return ans;
100+
return f[i][k] = ans;
105101
}
106102
}
107103
```
@@ -111,38 +107,26 @@ class Solution {
111107
```cpp
112108
class Solution {
113109
public:
114-
double f[110][110];
115-
int s[110];
116-
int n;
117-
118110
double largestSumOfAverages(vector<int>& nums, int k) {
119-
n = nums.size();
111+
int n = nums.size();
112+
int s[n + 1];
113+
double f[n][k + 1];
120114
s[0] = 0;
121-
for (int i = 0; i < n; ++i) {
122-
s[i + 1] = s[i] + nums[i];
123-
}
124-
memset(f, -1, sizeof f);
115+
memset(f, 0, sizeof f);
116+
for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i];
117+
function<double(int, int)> dfs = [&](int i, int k) -> double {
118+
if (i == n) return 0;
119+
if (k == 1) return (s[n] - s[i]) * 1.0 / (n - i);
120+
if (f[i][k]) return f[i][k];
121+
double ans = 0;
122+
for (int j = i; j < n; ++j) {
123+
double t = (s[j + 1] - s[i]) * 1.0 / (j - i + 1) + dfs(j + 1, k - 1);
124+
ans = max(ans, t);
125+
}
126+
return f[i][k] = ans;
127+
};
125128
return dfs(0, k);
126129
}
127-
128-
double dfs(int i, int k) {
129-
if (i == n) {
130-
return 0;
131-
}
132-
if (k == 1) {
133-
return (s[n] - s[i]) * 1.0 / (n - i);
134-
}
135-
if (f[i][k] >= 0) {
136-
return f[i][k];
137-
}
138-
double ans = 0;
139-
for (int j = i; j < n; ++j) {
140-
double t = (s[j + 1] - s[i]) * 1.0 / (j - i + 1) + dfs(j + 1, k - 1);
141-
ans = max(ans, t);
142-
}
143-
f[i][k] = ans;
144-
return ans;
145-
}
146130
};
147131
```
148132
@@ -152,13 +136,7 @@ public:
152136
func largestSumOfAverages(nums []int, k int) float64 {
153137
n := len(nums)
154138
s := make([]int, n+1)
155-
f := make([][]float64, n+1)
156-
for i := range f {
157-
f[i] = make([]float64, k+1)
158-
for j := range f[i] {
159-
f[i][j] = -1
160-
}
161-
}
139+
f := [110][110]float64{}
162140
for i, v := range nums {
163141
s[i+1] = s[i] + v
164142
}
@@ -170,7 +148,7 @@ func largestSumOfAverages(nums []int, k int) float64 {
170148
if k == 1 {
171149
return float64(s[n]-s[i]) / float64(n-i)
172150
}
173-
if f[i][k] >= 0 {
151+
if f[i][k] > 0 {
174152
return f[i][k]
175153
}
176154
var ans float64
Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,23 @@
11
class Solution {
22
public:
3-
double f[110][110];
4-
int s[110];
5-
int n;
6-
73
double largestSumOfAverages(vector<int>& nums, int k) {
8-
n = nums.size();
4+
int n = nums.size();
5+
int s[n + 1];
6+
double f[n][k + 1];
97
s[0] = 0;
10-
for (int i = 0; i < n; ++i) {
11-
s[i + 1] = s[i] + nums[i];
12-
}
13-
memset(f, -1, sizeof f);
8+
memset(f, 0, sizeof f);
9+
for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i];
10+
function<double(int, int)> dfs = [&](int i, int k) -> double {
11+
if (i == n) return 0;
12+
if (k == 1) return (s[n] - s[i]) * 1.0 / (n - i);
13+
if (f[i][k]) return f[i][k];
14+
double ans = 0;
15+
for (int j = i; j < n; ++j) {
16+
double t = (s[j + 1] - s[i]) * 1.0 / (j - i + 1) + dfs(j + 1, k - 1);
17+
ans = max(ans, t);
18+
}
19+
return f[i][k] = ans;
20+
};
1421
return dfs(0, k);
1522
}
16-
17-
double dfs(int i, int k) {
18-
if (i == n) {
19-
return 0;
20-
}
21-
if (k == 1) {
22-
return (s[n] - s[i]) * 1.0 / (n - i);
23-
}
24-
if (f[i][k] >= 0) {
25-
return f[i][k];
26-
}
27-
double ans = 0;
28-
for (int j = i; j < n; ++j) {
29-
double t = (s[j + 1] - s[i]) * 1.0 / (j - i + 1) + dfs(j + 1, k - 1);
30-
ans = max(ans, t);
31-
}
32-
f[i][k] = ans;
33-
return ans;
34-
}
3523
};

solution/0800-0899/0813.Largest Sum of Averages/Solution.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
func largestSumOfAverages(nums []int, k int) float64 {
22
n := len(nums)
33
s := make([]int, n+1)
4-
f := make([][]float64, n+1)
5-
for i := range f {
6-
f[i] = make([]float64, k+1)
7-
for j := range f[i] {
8-
f[i][j] = -1
9-
}
10-
}
4+
f := [110][110]float64{}
115
for i, v := range nums {
126
s[i+1] = s[i] + v
137
}
@@ -19,7 +13,7 @@ func largestSumOfAverages(nums []int, k int) float64 {
1913
if k == 1 {
2014
return float64(s[n]-s[i]) / float64(n-i)
2115
}
22-
if f[i][k] >= 0 {
16+
if f[i][k] > 0 {
2317
return f[i][k]
2418
}
2519
var ans float64
Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
class Solution {
2-
private double[][] f;
2+
private Double[][] f;
33
private int[] s;
44
private int n;
55

66
public double largestSumOfAverages(int[] nums, int k) {
77
n = nums.length;
88
s = new int[n + 1];
9-
f = new double[n + 1][k + 1];
10-
for (var e : f) {
11-
Arrays.fill(e, -1);
12-
}
9+
f = new Double[n + 1][k + 1];
1310
for (int i = 0; i < n; ++i) {
1411
s[i + 1] = s[i] + nums[i];
1512
}
@@ -23,15 +20,14 @@ private double dfs(int i, int k) {
2320
if (k == 1) {
2421
return (s[n] - s[i]) * 1.0 / (n - i);
2522
}
26-
if (f[i][k] >= 0) {
23+
if (f[i][k] != null) {
2724
return f[i][k];
2825
}
2926
double ans = 0;
3027
for (int j = i; j < n; ++j) {
3128
double t = (s[j + 1] - s[i]) * 1.0 / (j - i + 1) + dfs(j + 1, k - 1);
3229
ans = Math.max(ans, t);
3330
}
34-
f[i][k] = ans;
35-
return ans;
31+
return f[i][k] = ans;
3632
}
3733
}

solution/1700-1799/1752.Check if Array Is Sorted and Rotated/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
```python
7373
class Solution:
7474
def check(self, nums: List[int]) -> bool:
75-
return sum(v > nums[(i + 1) % len(nums)] for i, v in enumerate(nums)) <= 1
75+
return sum(nums[i - 1] > v for i, v in enumerate(nums)) <= 1
7676
```
7777

7878
### **Java**

solution/1700-1799/1752.Check if Array Is Sorted and Rotated/README_EN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ You can rotate the array by x = 0 positions (i.e. no rotation) to make nums.
5454
```python
5555
class Solution:
5656
def check(self, nums: List[int]) -> bool:
57-
return sum(v > nums[(i + 1) % len(nums)] for i, v in enumerate(nums)) <= 1
57+
return sum(nums[i - 1] > v for i, v in enumerate(nums)) <= 1
5858
```
5959

6060
### **Java**
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
class Solution:
22
def check(self, nums: List[int]) -> bool:
3-
return sum(v > nums[(i + 1) % len(nums)] for i, v in enumerate(nums)) <= 1
3+
return sum(nums[i - 1] > v for i, v in enumerate(nums)) <= 1

0 commit comments

Comments
 (0)