Skip to content

Commit 3fdbf30

Browse files
committed
feat: add solutions to lc problem: No.1043
No.1043.Partition Array for Maximum Sum
1 parent ea108f5 commit 3fdbf30

File tree

7 files changed

+125
-65
lines changed

7 files changed

+125
-65
lines changed

solution/1000-1099/1043.Partition Array for Maximum Sum/README.md

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,19 @@
4949

5050
**方法一:动态规划**
5151

52-
我们定义 $f[i]$ 表示将数组的前 $i$ 个元素分隔成若干个子数组,最终的最大元素和。那么 $f[i + 1]$ 的值可以通过枚举 $j$ 的值得到,其中 $j$ 的取值范围为 $[i - k + 1, i]$,对于每个 $j$,我们都可以将 $[j, i]$ 这一段分隔出来,这一段的最大值为 $mx$,那么 $f[i + 1]$ 的值可以通过 $f[j] + mx * (i - j + 1)$ 得到。最后的答案即为 $f[n]$。
52+
我们定义 $f[i]$ 表示将数组的前 $i$ 个元素分隔成若干个子数组,最终的最大元素和。初始时 $f[i]=0$,答案为 $f[n]$。
5353

54-
时间复杂度 $O(n \times k)$,空间复杂度 $O(n)$。其中 $n$ 为数组的长度。
54+
我们考虑如何计算 $f[i]$,其中 $i \geq 1$。
55+
56+
对于 $f[i]$,它的最后一个元素是 $arr[i-1]$。由于每个子数组的长度最多为 $k$,并且我们需要求得子数组中的最大值,因此,我们可以从右往左枚举最后一个子数组的第一个元素 $arr[j - 1]$,其中 $\max(0, i - k) \lt j \leq i$,过程中维护一个变量 $mx$,表示最后一个子数组中的最大值,那么状态转移方程为:
57+
58+
$$
59+
f[i] = \max\{f[i], f[j - 1] + mx \times (i - j + 1)\}
60+
$$
61+
62+
最终的答案即为 $f[n]$。
63+
64+
时间复杂度 $O(n \times k)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $arr$ 的长度。
5565

5666
<!-- tabs:start -->
5767

@@ -64,12 +74,11 @@ class Solution:
6474
def maxSumAfterPartitioning(self, arr: List[int], k: int) -> int:
6575
n = len(arr)
6676
f = [0] * (n + 1)
67-
for i in range(n):
77+
for i in range(1, n + 1):
6878
mx = 0
69-
for j in range(i, max(-1, i - k), -1):
70-
mx = max(mx, arr[j])
71-
t = mx * (i - j + 1) + f[j]
72-
f[i + 1] = max(f[i + 1], t)
79+
for j in range(i, max(0, i - k), -1):
80+
mx = max(mx, arr[j - 1])
81+
f[i] = max(f[i], f[j - 1] + mx * (i - j + 1))
7382
return f[n]
7483
```
7584

@@ -82,12 +91,11 @@ class Solution {
8291
public int maxSumAfterPartitioning(int[] arr, int k) {
8392
int n = arr.length;
8493
int[] f = new int[n + 1];
85-
for (int i = 0; i < n; ++i) {
94+
for (int i = 1; i <= n; ++i) {
8695
int mx = 0;
87-
for (int j = i; j >= Math.max(0, i - k + 1); --j) {
88-
mx = Math.max(mx, arr[j]);
89-
int t = mx * (i - j + 1) + f[j];
90-
f[i + 1] = Math.max(f[i + 1], t);
96+
for (int j = i; j > Math.max(0, i - k); --j) {
97+
mx = Math.max(mx, arr[j - 1]);
98+
f[i] = Math.max(f[i], f[j - 1] + mx * (i - j + 1));
9199
}
92100
}
93101
return f[n];
@@ -103,13 +111,12 @@ public:
103111
int maxSumAfterPartitioning(vector<int>& arr, int k) {
104112
int n = arr.size();
105113
int f[n + 1];
106-
memset(f, 0, sizeof f);
107-
for (int i = 0; i < n; ++i) {
114+
memset(f, 0, sizeof(f));
115+
for (int i = 1; i <= n; ++i) {
108116
int mx = 0;
109-
for (int j = i; j >= max(0, i - k + 1); --j) {
110-
mx = max(mx, arr[j]);
111-
int t = mx * (i - j + 1) + f[j];
112-
f[i + 1] = max(f[i + 1], t);
117+
for (int j = i; j > max(0, i - k); --j) {
118+
mx = max(mx, arr[j - 1]);
119+
f[i] = max(f[i], f[j - 1] + mx * (i - j + 1));
113120
}
114121
}
115122
return f[n];
@@ -123,12 +130,11 @@ public:
123130
func maxSumAfterPartitioning(arr []int, k int) int {
124131
n := len(arr)
125132
f := make([]int, n+1)
126-
for i := 0; i < n; i++ {
133+
for i := 1; i <= n; i++ {
127134
mx := 0
128-
for j := i; j >= max(0, i-k+1); j-- {
129-
mx = max(mx, arr[j])
130-
t := mx*(i-j+1) + f[j]
131-
f[i+1] = max(f[i+1], t)
135+
for j := i; j > max(0, i-k); j-- {
136+
mx = max(mx, arr[j-1])
137+
f[i] = max(f[i], f[j-1]+mx*(i-j+1))
132138
}
133139
}
134140
return f[n]
@@ -142,6 +148,23 @@ func max(a, b int) int {
142148
}
143149
```
144150

151+
### **TypeScript**
152+
153+
```ts
154+
function maxSumAfterPartitioning(arr: number[], k: number): number {
155+
const n: number = arr.length;
156+
const f: number[] = new Array(n + 1).fill(0);
157+
for (let i = 1; i <= n; ++i) {
158+
let mx: number = 0;
159+
for (let j = i; j > Math.max(0, i - k); --j) {
160+
mx = Math.max(mx, arr[j - 1]);
161+
f[i] = Math.max(f[i], f[j - 1] + mx * (i - j + 1));
162+
}
163+
}
164+
return f[n];
165+
}
166+
```
167+
145168
### **...**
146169

147170
```

solution/1000-1099/1043.Partition Array for Maximum Sum/README_EN.md

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,22 @@
4242

4343
## Solutions
4444

45+
**Approach 1: Dynamic Programming**
46+
47+
We define $f[i]$ to represent the maximum element sum of the first $i$ elements of the array after separating them into several subarrays. At the beginning, $f[i]=0$, and the answer is $f[n]$.
48+
49+
We consider how to calculate $f[i]$, where $i \geq 1$.
50+
51+
For $f[i]$, its last element is $arr[i-1]$. Since the maximum length of each subarray is $k$, and we need to find the maximum value in the subarray, we can enumerate the first element $arr[j - 1]$ of the last subarray from right to left, where $\max(0, i - k) \lt j \leq i$, and maintain a variable $mx$ during the process to represent the maximum value in the subarray. The state transition equation is:
52+
53+
$$
54+
f[i] = \max\{f[i], f[j - 1] + mx \times (i - j + 1)\}
55+
$$
56+
57+
The final answer is $f[n]$.
58+
59+
The time complexity is $O(n \times k)$, and the space complexity is $O(n)$, where $n$ is the length of the array $arr$.
60+
4561
<!-- tabs:start -->
4662

4763
### **Python3**
@@ -51,12 +67,11 @@ class Solution:
5167
def maxSumAfterPartitioning(self, arr: List[int], k: int) -> int:
5268
n = len(arr)
5369
f = [0] * (n + 1)
54-
for i in range(n):
70+
for i in range(1, n + 1):
5571
mx = 0
56-
for j in range(i, max(-1, i - k), -1):
57-
mx = max(mx, arr[j])
58-
t = mx * (i - j + 1) + f[j]
59-
f[i + 1] = max(f[i + 1], t)
72+
for j in range(i, max(0, i - k), -1):
73+
mx = max(mx, arr[j - 1])
74+
f[i] = max(f[i], f[j - 1] + mx * (i - j + 1))
6075
return f[n]
6176
```
6277

@@ -67,12 +82,11 @@ class Solution {
6782
public int maxSumAfterPartitioning(int[] arr, int k) {
6883
int n = arr.length;
6984
int[] f = new int[n + 1];
70-
for (int i = 0; i < n; ++i) {
85+
for (int i = 1; i <= n; ++i) {
7186
int mx = 0;
72-
for (int j = i; j >= Math.max(0, i - k + 1); --j) {
73-
mx = Math.max(mx, arr[j]);
74-
int t = mx * (i - j + 1) + f[j];
75-
f[i + 1] = Math.max(f[i + 1], t);
87+
for (int j = i; j > Math.max(0, i - k); --j) {
88+
mx = Math.max(mx, arr[j - 1]);
89+
f[i] = Math.max(f[i], f[j - 1] + mx * (i - j + 1));
7690
}
7791
}
7892
return f[n];
@@ -88,13 +102,12 @@ public:
88102
int maxSumAfterPartitioning(vector<int>& arr, int k) {
89103
int n = arr.size();
90104
int f[n + 1];
91-
memset(f, 0, sizeof f);
92-
for (int i = 0; i < n; ++i) {
105+
memset(f, 0, sizeof(f));
106+
for (int i = 1; i <= n; ++i) {
93107
int mx = 0;
94-
for (int j = i; j >= max(0, i - k + 1); --j) {
95-
mx = max(mx, arr[j]);
96-
int t = mx * (i - j + 1) + f[j];
97-
f[i + 1] = max(f[i + 1], t);
108+
for (int j = i; j > max(0, i - k); --j) {
109+
mx = max(mx, arr[j - 1]);
110+
f[i] = max(f[i], f[j - 1] + mx * (i - j + 1));
98111
}
99112
}
100113
return f[n];
@@ -108,12 +121,11 @@ public:
108121
func maxSumAfterPartitioning(arr []int, k int) int {
109122
n := len(arr)
110123
f := make([]int, n+1)
111-
for i := 0; i < n; i++ {
124+
for i := 1; i <= n; i++ {
112125
mx := 0
113-
for j := i; j >= max(0, i-k+1); j-- {
114-
mx = max(mx, arr[j])
115-
t := mx*(i-j+1) + f[j]
116-
f[i+1] = max(f[i+1], t)
126+
for j := i; j > max(0, i-k); j-- {
127+
mx = max(mx, arr[j-1])
128+
f[i] = max(f[i], f[j-1]+mx*(i-j+1))
117129
}
118130
}
119131
return f[n]
@@ -127,6 +139,23 @@ func max(a, b int) int {
127139
}
128140
```
129141

142+
### **TypeScript**
143+
144+
```ts
145+
function maxSumAfterPartitioning(arr: number[], k: number): number {
146+
const n: number = arr.length;
147+
const f: number[] = new Array(n + 1).fill(0);
148+
for (let i = 1; i <= n; ++i) {
149+
let mx: number = 0;
150+
for (let j = i; j > Math.max(0, i - k); --j) {
151+
mx = Math.max(mx, arr[j - 1]);
152+
f[i] = Math.max(f[i], f[j - 1] + mx * (i - j + 1));
153+
}
154+
}
155+
return f[n];
156+
}
157+
```
158+
130159
### **...**
131160

132161
```

solution/1000-1099/1043.Partition Array for Maximum Sum/Solution.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@ class Solution {
33
int maxSumAfterPartitioning(vector<int>& arr, int k) {
44
int n = arr.size();
55
int f[n + 1];
6-
memset(f, 0, sizeof f);
7-
for (int i = 0; i < n; ++i) {
6+
memset(f, 0, sizeof(f));
7+
for (int i = 1; i <= n; ++i) {
88
int mx = 0;
9-
for (int j = i; j >= max(0, i - k + 1); --j) {
10-
mx = max(mx, arr[j]);
11-
int t = mx * (i - j + 1) + f[j];
12-
f[i + 1] = max(f[i + 1], t);
9+
for (int j = i; j > max(0, i - k); --j) {
10+
mx = max(mx, arr[j - 1]);
11+
f[i] = max(f[i], f[j - 1] + mx * (i - j + 1));
1312
}
1413
}
1514
return f[n];

solution/1000-1099/1043.Partition Array for Maximum Sum/Solution.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
func maxSumAfterPartitioning(arr []int, k int) int {
22
n := len(arr)
33
f := make([]int, n+1)
4-
for i := 0; i < n; i++ {
4+
for i := 1; i <= n; i++ {
55
mx := 0
6-
for j := i; j >= max(0, i-k+1); j-- {
7-
mx = max(mx, arr[j])
8-
t := mx*(i-j+1) + f[j]
9-
f[i+1] = max(f[i+1], t)
6+
for j := i; j > max(0, i-k); j-- {
7+
mx = max(mx, arr[j-1])
8+
f[i] = max(f[i], f[j-1]+mx*(i-j+1))
109
}
1110
}
1211
return f[n]

solution/1000-1099/1043.Partition Array for Maximum Sum/Solution.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@ class Solution {
22
public int maxSumAfterPartitioning(int[] arr, int k) {
33
int n = arr.length;
44
int[] f = new int[n + 1];
5-
for (int i = 0; i < n; ++i) {
5+
for (int i = 1; i <= n; ++i) {
66
int mx = 0;
7-
for (int j = i; j >= Math.max(0, i - k + 1); --j) {
8-
mx = Math.max(mx, arr[j]);
9-
int t = mx * (i - j + 1) + f[j];
10-
f[i + 1] = Math.max(f[i + 1], t);
7+
for (int j = i; j > Math.max(0, i - k); --j) {
8+
mx = Math.max(mx, arr[j - 1]);
9+
f[i] = Math.max(f[i], f[j - 1] + mx * (i - j + 1));
1110
}
1211
}
1312
return f[n];

solution/1000-1099/1043.Partition Array for Maximum Sum/Solution.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ class Solution:
22
def maxSumAfterPartitioning(self, arr: List[int], k: int) -> int:
33
n = len(arr)
44
f = [0] * (n + 1)
5-
for i in range(n):
5+
for i in range(1, n + 1):
66
mx = 0
7-
for j in range(i, max(-1, i - k), -1):
8-
mx = max(mx, arr[j])
9-
t = mx * (i - j + 1) + f[j]
10-
f[i + 1] = max(f[i + 1], t)
7+
for j in range(i, max(0, i - k), -1):
8+
mx = max(mx, arr[j - 1])
9+
f[i] = max(f[i], f[j - 1] + mx * (i - j + 1))
1110
return f[n]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
function maxSumAfterPartitioning(arr: number[], k: number): number {
2+
const n: number = arr.length;
3+
const f: number[] = new Array(n + 1).fill(0);
4+
for (let i = 1; i <= n; ++i) {
5+
let mx: number = 0;
6+
for (let j = i; j > Math.max(0, i - k); --j) {
7+
mx = Math.max(mx, arr[j - 1]);
8+
f[i] = Math.max(f[i], f[j - 1] + mx * (i - j + 1));
9+
}
10+
}
11+
return f[n];
12+
}

0 commit comments

Comments
 (0)