Skip to content

Commit b4b0c24

Browse files
committed
feat: add solutions to lc problem: No.1749
No.1749.Maximum Absolute Sum of Any Subarray
1 parent 961bc93 commit b4b0c24

File tree

6 files changed

+227
-2
lines changed

6 files changed

+227
-2
lines changed

solution/1700-1799/1749.Maximum Absolute Sum of Any Subarray/README.md

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,111 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51+
**方法一:动态规划**
52+
53+
我们定义 $f[i]$ 表示以 $nums[i]$ 结尾的子数组的和的最大值,定义 $g[i]$ 表示以 $nums[i]$ 结尾的子数组的和的最小值。那么 $f[i]$ 和 $g[i]$ 的状态转移方程如下:
54+
55+
$$
56+
\begin{aligned}
57+
f[i] &= \max(f[i - 1], 0) + nums[i] \\
58+
g[i] &= \min(g[i - 1], 0) + nums[i]
59+
\end{aligned}
60+
$$
61+
62+
最后答案为 $max(f[i], |g[i]|)$ 的最大值。
63+
64+
由于 $f[i]$ 和 $g[i]$ 只与 $f[i - 1]$ 和 $g[i - 1]$ 有关,因此我们可以使用两个变量代替数组,将空间复杂度降低到 $O(1)$。
65+
66+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $nums$ 的长度。
67+
5168
<!-- tabs:start -->
5269

5370
### **Python3**
5471

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

5774
```python
58-
75+
class Solution:
76+
def maxAbsoluteSum(self, nums: List[int]) -> int:
77+
f = g = 0
78+
ans = 0
79+
for x in nums:
80+
f = max(f, 0) + x
81+
g = min(g, 0) + x
82+
ans = max(ans, f, abs(g))
83+
return ans
5984
```
6085

6186
### **Java**
6287

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

6590
```java
91+
class Solution {
92+
public int maxAbsoluteSum(int[] nums) {
93+
int f = 0, g = 0;
94+
int ans = 0;
95+
for (int x : nums) {
96+
f = Math.max(f, 0) + x;
97+
g = Math.min(g, 0) + x;
98+
ans = Math.max(ans, Math.max(f, Math.abs(g)));
99+
}
100+
return ans;
101+
}
102+
}
103+
```
104+
105+
### **C++**
106+
107+
```cpp
108+
class Solution {
109+
public:
110+
int maxAbsoluteSum(vector<int>& nums) {
111+
int f = 0, g = 0;
112+
int ans = 0;
113+
for (int& x : nums) {
114+
f = max(f, 0) + x;
115+
g = min(g, 0) + x;
116+
ans = max({ans, f, abs(g)});
117+
}
118+
return ans;
119+
}
120+
};
121+
```
66122
123+
### **Go**
124+
125+
```go
126+
func maxAbsoluteSum(nums []int) (ans int) {
127+
var f, g int
128+
for _, x := range nums {
129+
f = max(f, 0) + x
130+
g = min(g, 0) + x
131+
ans = max(ans, max(f, abs(g)))
132+
}
133+
return
134+
}
135+
136+
func abs(x int) int {
137+
if x < 0 {
138+
return -x
139+
}
140+
return x
141+
}
142+
143+
func max(a, b int) int {
144+
if a > b {
145+
return a
146+
}
147+
return b
148+
}
149+
150+
func min(a, b int) int {
151+
if a < b {
152+
return a
153+
}
154+
return b
155+
}
67156
```
68157

69158
### **...**

solution/1700-1799/1749.Maximum Absolute Sum of Any Subarray/README_EN.md

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,85 @@
4747
### **Python3**
4848

4949
```python
50-
50+
class Solution:
51+
def maxAbsoluteSum(self, nums: List[int]) -> int:
52+
f = g = 0
53+
ans = 0
54+
for x in nums:
55+
f = max(f, 0) + x
56+
g = min(g, 0) + x
57+
ans = max(ans, f, abs(g))
58+
return ans
5159
```
5260

5361
### **Java**
5462

5563
```java
64+
class Solution {
65+
public int maxAbsoluteSum(int[] nums) {
66+
int f = 0, g = 0;
67+
int ans = 0;
68+
for (int x : nums) {
69+
f = Math.max(f, 0) + x;
70+
g = Math.min(g, 0) + x;
71+
ans = Math.max(ans, Math.max(f, Math.abs(g)));
72+
}
73+
return ans;
74+
}
75+
}
76+
```
77+
78+
### **C++**
79+
80+
```cpp
81+
class Solution {
82+
public:
83+
int maxAbsoluteSum(vector<int>& nums) {
84+
int f = 0, g = 0;
85+
int ans = 0;
86+
for (int& x : nums) {
87+
f = max(f, 0) + x;
88+
g = min(g, 0) + x;
89+
ans = max({ans, f, abs(g)});
90+
}
91+
return ans;
92+
}
93+
};
94+
```
5695
96+
### **Go**
97+
98+
```go
99+
func maxAbsoluteSum(nums []int) (ans int) {
100+
var f, g int
101+
for _, x := range nums {
102+
f = max(f, 0) + x
103+
g = min(g, 0) + x
104+
ans = max(ans, max(f, abs(g)))
105+
}
106+
return
107+
}
108+
109+
func abs(x int) int {
110+
if x < 0 {
111+
return -x
112+
}
113+
return x
114+
}
115+
116+
func max(a, b int) int {
117+
if a > b {
118+
return a
119+
}
120+
return b
121+
}
122+
123+
func min(a, b int) int {
124+
if a < b {
125+
return a
126+
}
127+
return b
128+
}
57129
```
58130

59131
### **...**
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public:
3+
int maxAbsoluteSum(vector<int>& nums) {
4+
int f = 0, g = 0;
5+
int ans = 0;
6+
for (int& x : nums) {
7+
f = max(f, 0) + x;
8+
g = min(g, 0) + x;
9+
ans = max({ans, f, abs(g)});
10+
}
11+
return ans;
12+
}
13+
};
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
func maxAbsoluteSum(nums []int) (ans int) {
2+
var f, g int
3+
for _, x := range nums {
4+
f = max(f, 0) + x
5+
g = min(g, 0) + x
6+
ans = max(ans, max(f, abs(g)))
7+
}
8+
return
9+
}
10+
11+
func abs(x int) int {
12+
if x < 0 {
13+
return -x
14+
}
15+
return x
16+
}
17+
18+
func max(a, b int) int {
19+
if a > b {
20+
return a
21+
}
22+
return b
23+
}
24+
25+
func min(a, b int) int {
26+
if a < b {
27+
return a
28+
}
29+
return b
30+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public int maxAbsoluteSum(int[] nums) {
3+
int f = 0, g = 0;
4+
int ans = 0;
5+
for (int x : nums) {
6+
f = Math.max(f, 0) + x;
7+
g = Math.min(g, 0) + x;
8+
ans = Math.max(ans, Math.max(f, Math.abs(g)));
9+
}
10+
return ans;
11+
}
12+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def maxAbsoluteSum(self, nums: List[int]) -> int:
3+
f = g = 0
4+
ans = 0
5+
for x in nums:
6+
f = max(f, 0) + x
7+
g = min(g, 0) + x
8+
ans = max(ans, f, abs(g))
9+
return ans

0 commit comments

Comments
 (0)