Skip to content

Commit 5c6efdc

Browse files
committed
feat: add solutions to lc problem: No.2036
No.2036.Maximum Alternating Subarray Sum
1 parent 208bba0 commit 5c6efdc

File tree

6 files changed

+200
-2
lines changed

6 files changed

+200
-2
lines changed

solution/2000-2099/2036.Maximum Alternating Subarray Sum/README.md

+81-1
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,102 @@
5555

5656
<!-- 这里可写通用的实现逻辑 -->
5757

58+
**方法一:动态规划**
59+
60+
定义状态 $a$ 表示以当前元素作为正结尾的最大交替子数组和,状态 $b$ 表示以当前元素作为负结尾的最大交替子数组和。初始时 $a = nums[0]$,$b = -\infty$。
61+
62+
遍历数组,对于当前元素 $nums[i]$,有
63+
64+
$$
65+
\begin{aligned}
66+
a = \max(nums[i], b + nums[i]) \\
67+
b = a - nums[i]
68+
\end{aligned}
69+
$$
70+
71+
求出 $a$ 和 $b$ 后,将 $a$ 和 $b$ 中的最大值与当前最大交替子数组和进行比较,更新最大交替子数组和。
72+
73+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度。
74+
5875
<!-- tabs:start -->
5976

6077
### **Python3**
6178

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

6481
```python
65-
82+
class Solution:
83+
def maximumAlternatingSubarraySum(self, nums: List[int]) -> int:
84+
ans = nums[0]
85+
a, b = nums[0], -inf
86+
for v in nums[1:]:
87+
a, b = max(v, b + v), a - v
88+
ans = max(ans, a, b)
89+
return ans
6690
```
6791

6892
### **Java**
6993

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

7296
```java
97+
class Solution {
98+
public long maximumAlternatingSubarraySum(int[] nums) {
99+
long ans = nums[0];
100+
long a = nums[0], b = -(1 << 30);
101+
for (int i = 1; i < nums.length; ++i) {
102+
long c = a, d = b;
103+
a = Math.max(nums[i], d + nums[i]);
104+
b = c - nums[i];
105+
ans = Math.max(ans, Math.max(a, b));
106+
}
107+
return ans;
108+
}
109+
}
110+
```
111+
112+
### **C++**
113+
114+
```cpp
115+
using ll = long long;
116+
117+
class Solution {
118+
public:
119+
long long maximumAlternatingSubarraySum(vector<int>& nums) {
120+
ll ans = nums[0];
121+
ll a = nums[0], b = -(1 << 30);
122+
for (int i = 1; i < nums.size(); ++i) {
123+
ll c = a, d = b;
124+
a = max(1ll * nums[i], d + nums[i]);
125+
b = c - nums[i];
126+
ans = max(ans, max(a, b));
127+
}
128+
return ans;
129+
}
130+
};
131+
```
73132
133+
### **Go**
134+
135+
```go
136+
func maximumAlternatingSubarraySum(nums []int) int64 {
137+
ans := nums[0]
138+
a, b := nums[0], -(1 << 30)
139+
for _, v := range nums[1:] {
140+
c, d := a, b
141+
a = max(v, d+v)
142+
b = c - v
143+
ans = max(ans, max(a, b))
144+
}
145+
return int64(ans)
146+
}
147+
148+
func max(a, b int) int {
149+
if a > b {
150+
return a
151+
}
152+
return b
153+
}
74154
```
75155

76156
### **...**

solution/2000-2099/2036.Maximum Alternating Subarray Sum/README_EN.md

+64-1
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,76 @@ The alternating subarray sum is 1.
5858
### **Python3**
5959

6060
```python
61-
61+
class Solution:
62+
def maximumAlternatingSubarraySum(self, nums: List[int]) -> int:
63+
ans = nums[0]
64+
a, b = nums[0], -inf
65+
for v in nums[1:]:
66+
a, b = max(v, b + v), a - v
67+
ans = max(ans, a, b)
68+
return ans
6269
```
6370

6471
### **Java**
6572

6673
```java
74+
class Solution {
75+
public long maximumAlternatingSubarraySum(int[] nums) {
76+
long ans = nums[0];
77+
long a = nums[0], b = -(1 << 30);
78+
for (int i = 1; i < nums.length; ++i) {
79+
long c = a, d = b;
80+
a = Math.max(nums[i], d + nums[i]);
81+
b = c - nums[i];
82+
ans = Math.max(ans, Math.max(a, b));
83+
}
84+
return ans;
85+
}
86+
}
87+
```
88+
89+
### **C++**
90+
91+
```cpp
92+
using ll = long long;
93+
94+
class Solution {
95+
public:
96+
long long maximumAlternatingSubarraySum(vector<int>& nums) {
97+
ll ans = nums[0];
98+
ll a = nums[0], b = -(1 << 30);
99+
for (int i = 1; i < nums.size(); ++i) {
100+
ll c = a, d = b;
101+
a = max(1ll * nums[i], d + nums[i]);
102+
b = c - nums[i];
103+
ans = max(ans, max(a, b));
104+
}
105+
return ans;
106+
}
107+
};
108+
```
67109
110+
### **Go**
111+
112+
```go
113+
func maximumAlternatingSubarraySum(nums []int) int64 {
114+
ans := nums[0]
115+
a, b := nums[0], -(1 << 30)
116+
for _, v := range nums[1:] {
117+
c, d := a, b
118+
a = max(v, d+v)
119+
b = c - v
120+
ans = max(ans, max(a, b))
121+
}
122+
return int64(ans)
123+
}
124+
125+
func max(a, b int) int {
126+
if a > b {
127+
return a
128+
}
129+
return b
130+
}
68131
```
69132

70133
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using ll = long long;
2+
3+
class Solution {
4+
public:
5+
long long maximumAlternatingSubarraySum(vector<int>& nums) {
6+
ll ans = nums[0];
7+
ll a = nums[0], b = -(1 << 30);
8+
for (int i = 1; i < nums.size(); ++i) {
9+
ll c = a, d = b;
10+
a = max(1ll * nums[i], d + nums[i]);
11+
b = c - nums[i];
12+
ans = max(ans, max(a, b));
13+
}
14+
return ans;
15+
}
16+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func maximumAlternatingSubarraySum(nums []int) int64 {
2+
ans := nums[0]
3+
a, b := nums[0], -(1 << 30)
4+
for _, v := range nums[1:] {
5+
c, d := a, b
6+
a = max(v, d+v)
7+
b = c - v
8+
ans = max(ans, max(a, b))
9+
}
10+
return int64(ans)
11+
}
12+
13+
func max(a, b int) int {
14+
if a > b {
15+
return a
16+
}
17+
return b
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public long maximumAlternatingSubarraySum(int[] nums) {
3+
long ans = nums[0];
4+
long a = nums[0], b = -(1 << 30);
5+
for (int i = 1; i < nums.length; ++i) {
6+
long c = a, d = b;
7+
a = Math.max(nums[i], d + nums[i]);
8+
b = c - nums[i];
9+
ans = Math.max(ans, Math.max(a, b));
10+
}
11+
return ans;
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class Solution:
2+
def maximumAlternatingSubarraySum(self, nums: List[int]) -> int:
3+
ans = nums[0]
4+
a, b = nums[0], -inf
5+
for v in nums[1:]:
6+
a, b = max(v, b + v), a - v
7+
ans = max(ans, a, b)
8+
return ans

0 commit comments

Comments
 (0)