Skip to content

Commit faa39e9

Browse files
authored
feat: add solutions to lc problem: No.3259 (#3699)
No.3259.Maximum Energy Boost From Two Drinks
1 parent 813d38b commit faa39e9

File tree

7 files changed

+219
-0
lines changed

7 files changed

+219
-0
lines changed

solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/README.md

+86
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,90 @@ function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number
180180

181181
<!-- solution:end -->
182182

183+
<!-- solution:start -->
184+
185+
### 方法二:动态规划(空间优化)
186+
187+
我们注意到,状态 $f[i]$ 至于 $f[i - 1]$ 有关,而与 $f[i - 2]$ 无关。因此我们可以只使用两个变量 $f$ 和 $g$ 来维护状态,从而将空间复杂度优化到 $O(1)$。
188+
189+
时间复杂度 $O(n)$,其中 $n$ 为数组的长度。空间复杂度 $O(1)$。
190+
191+
<!-- tabs:start -->
192+
193+
#### Python3
194+
195+
```python
196+
class Solution:
197+
def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int:
198+
f, g = energyDrinkA[0], energyDrinkB[0]
199+
for a, b in zip(energyDrinkA[1:], energyDrinkB[1:]):
200+
f, g = max(f + a, g), max(g + b, f)
201+
return max(f, g)
202+
```
203+
204+
#### Java
205+
206+
```java
207+
class Solution {
208+
public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) {
209+
int n = energyDrinkA.length;
210+
long f = energyDrinkA[0], g = energyDrinkB[0];
211+
for (int i = 1; i < n; ++i) {
212+
long ff = Math.max(f + energyDrinkA[i], g);
213+
g = Math.max(g + energyDrinkB[i], f);
214+
f = ff;
215+
}
216+
return Math.max(f, g);
217+
}
218+
}
219+
```
220+
221+
#### C++
222+
223+
```cpp
224+
class Solution {
225+
public:
226+
long long maxEnergyBoost(vector<int>& energyDrinkA, vector<int>& energyDrinkB) {
227+
int n = energyDrinkA.size();
228+
long long f = energyDrinkA[0], g = energyDrinkB[0];
229+
for (int i = 1; i < n; ++i) {
230+
long long ff = max(f + energyDrinkA[i], g);
231+
g = max(g + energyDrinkB[i], f);
232+
f = ff;
233+
}
234+
return max(f, g);
235+
}
236+
};
237+
```
238+
239+
#### Go
240+
241+
```go
242+
func maxEnergyBoost(energyDrinkA []int, energyDrinkB []int) int64 {
243+
n := len(energyDrinkA)
244+
f, g := energyDrinkA[0], energyDrinkB[0]
245+
for i := 1; i < n; i++ {
246+
f, g = max(f+energyDrinkA[i], g), max(g+energyDrinkB[i], f)
247+
}
248+
return int64(max(f, g))
249+
}
250+
```
251+
252+
#### TypeScript
253+
254+
```ts
255+
function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number {
256+
const n = energyDrinkA.length;
257+
let [f, g] = [energyDrinkA[0], energyDrinkB[0]];
258+
for (let i = 1; i < n; ++i) {
259+
[f, g] = [Math.max(f + energyDrinkA[i], g), Math.max(g + energyDrinkB[i], f)];
260+
}
261+
return Math.max(f, g);
262+
}
263+
```
264+
265+
<!-- tabs:end -->
266+
267+
<!-- solution:end -->
268+
183269
<!-- problem:end -->

solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/README_EN.md

+86
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,90 @@ function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number
180180

181181
<!-- solution:end -->
182182

183+
<!-- solution:start -->
184+
185+
### Solution 2: Dynamic Programming (Space Optimization)
186+
187+
We notice that the state $f[i]$ is only related to $f[i - 1]$ and not to $f[i - 2]$. Therefore, we can use only two variables $f$ and $g$ to maintain the state, thus optimizing the space complexity to $O(1)$.
188+
189+
The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$.
190+
191+
<!-- tabs:start -->
192+
193+
#### Python3
194+
195+
```python
196+
class Solution:
197+
def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int:
198+
f, g = energyDrinkA[0], energyDrinkB[0]
199+
for a, b in zip(energyDrinkA[1:], energyDrinkB[1:]):
200+
f, g = max(f + a, g), max(g + b, f)
201+
return max(f, g)
202+
```
203+
204+
#### Java
205+
206+
```java
207+
class Solution {
208+
public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) {
209+
int n = energyDrinkA.length;
210+
long f = energyDrinkA[0], g = energyDrinkB[0];
211+
for (int i = 1; i < n; ++i) {
212+
long ff = Math.max(f + energyDrinkA[i], g);
213+
g = Math.max(g + energyDrinkB[i], f);
214+
f = ff;
215+
}
216+
return Math.max(f, g);
217+
}
218+
}
219+
```
220+
221+
#### C++
222+
223+
```cpp
224+
class Solution {
225+
public:
226+
long long maxEnergyBoost(vector<int>& energyDrinkA, vector<int>& energyDrinkB) {
227+
int n = energyDrinkA.size();
228+
long long f = energyDrinkA[0], g = energyDrinkB[0];
229+
for (int i = 1; i < n; ++i) {
230+
long long ff = max(f + energyDrinkA[i], g);
231+
g = max(g + energyDrinkB[i], f);
232+
f = ff;
233+
}
234+
return max(f, g);
235+
}
236+
};
237+
```
238+
239+
#### Go
240+
241+
```go
242+
func maxEnergyBoost(energyDrinkA []int, energyDrinkB []int) int64 {
243+
n := len(energyDrinkA)
244+
f, g := energyDrinkA[0], energyDrinkB[0]
245+
for i := 1; i < n; i++ {
246+
f, g = max(f+energyDrinkA[i], g), max(g+energyDrinkB[i], f)
247+
}
248+
return int64(max(f, g))
249+
}
250+
```
251+
252+
#### TypeScript
253+
254+
```ts
255+
function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number {
256+
const n = energyDrinkA.length;
257+
let [f, g] = [energyDrinkA[0], energyDrinkB[0]];
258+
for (let i = 1; i < n; ++i) {
259+
[f, g] = [Math.max(f + energyDrinkA[i], g), Math.max(g + energyDrinkB[i], f)];
260+
}
261+
return Math.max(f, g);
262+
}
263+
```
264+
265+
<!-- tabs:end -->
266+
267+
<!-- solution:end -->
268+
183269
<!-- problem:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public:
3+
long long maxEnergyBoost(vector<int>& energyDrinkA, vector<int>& energyDrinkB) {
4+
int n = energyDrinkA.size();
5+
long long f = energyDrinkA[0], g = energyDrinkB[0];
6+
for (int i = 1; i < n; ++i) {
7+
long long ff = max(f + energyDrinkA[i], g);
8+
g = max(g + energyDrinkB[i], f);
9+
f = ff;
10+
}
11+
return max(f, g);
12+
}
13+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
func maxEnergyBoost(energyDrinkA []int, energyDrinkB []int) int64 {
2+
n := len(energyDrinkA)
3+
f, g := energyDrinkA[0], energyDrinkB[0]
4+
for i := 1; i < n; i++ {
5+
f, g = max(f+energyDrinkA[i], g), max(g+energyDrinkB[i], f)
6+
}
7+
return int64(max(f, g))
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) {
3+
int n = energyDrinkA.length;
4+
long f = energyDrinkA[0], g = energyDrinkB[0];
5+
for (int i = 1; i < n; ++i) {
6+
long ff = Math.max(f + energyDrinkA[i], g);
7+
g = Math.max(g + energyDrinkB[i], f);
8+
f = ff;
9+
}
10+
return Math.max(f, g);
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class Solution:
2+
def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int:
3+
f, g = energyDrinkA[0], energyDrinkB[0]
4+
for a, b in zip(energyDrinkA[1:], energyDrinkB[1:]):
5+
f, g = max(f + a, g), max(g + b, f)
6+
return max(f, g)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number {
2+
const n = energyDrinkA.length;
3+
let [f, g] = [energyDrinkA[0], energyDrinkB[0]];
4+
for (let i = 1; i < n; ++i) {
5+
[f, g] = [Math.max(f + energyDrinkA[i], g), Math.max(g + energyDrinkB[i], f)];
6+
}
7+
return Math.max(f, g);
8+
}

0 commit comments

Comments
 (0)