diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/README.md b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/README.md index 6b1d9aeb3b947..ecce7729b2b6b 100644 --- a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/README.md +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/README.md @@ -180,4 +180,90 @@ function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number + + +### 方法二:动态规划(空间优化) + +我们注意到,状态 $f[i]$ 至于 $f[i - 1]$ 有关,而与 $f[i - 2]$ 无关。因此我们可以只使用两个变量 $f$ 和 $g$ 来维护状态,从而将空间复杂度优化到 $O(1)$。 + +时间复杂度 $O(n)$,其中 $n$ 为数组的长度。空间复杂度 $O(1)$。 + + + +#### Python3 + +```python +class Solution: + def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int: + f, g = energyDrinkA[0], energyDrinkB[0] + for a, b in zip(energyDrinkA[1:], energyDrinkB[1:]): + f, g = max(f + a, g), max(g + b, f) + return max(f, g) +``` + +#### Java + +```java +class Solution { + public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) { + int n = energyDrinkA.length; + long f = energyDrinkA[0], g = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + long ff = Math.max(f + energyDrinkA[i], g); + g = Math.max(g + energyDrinkB[i], f); + f = ff; + } + return Math.max(f, g); + } +} +``` + +#### C++ + +```cpp +class Solution { +public: + long long maxEnergyBoost(vector& energyDrinkA, vector& energyDrinkB) { + int n = energyDrinkA.size(); + long long f = energyDrinkA[0], g = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + long long ff = max(f + energyDrinkA[i], g); + g = max(g + energyDrinkB[i], f); + f = ff; + } + return max(f, g); + } +}; +``` + +#### Go + +```go +func maxEnergyBoost(energyDrinkA []int, energyDrinkB []int) int64 { + n := len(energyDrinkA) + f, g := energyDrinkA[0], energyDrinkB[0] + for i := 1; i < n; i++ { + f, g = max(f+energyDrinkA[i], g), max(g+energyDrinkB[i], f) + } + return int64(max(f, g)) +} +``` + +#### TypeScript + +```ts +function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number { + const n = energyDrinkA.length; + let [f, g] = [energyDrinkA[0], energyDrinkB[0]]; + for (let i = 1; i < n; ++i) { + [f, g] = [Math.max(f + energyDrinkA[i], g), Math.max(g + energyDrinkB[i], f)]; + } + return Math.max(f, g); +} +``` + + + + + diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/README_EN.md b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/README_EN.md index 229cf29a32b41..5558538376f64 100644 --- a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/README_EN.md +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/README_EN.md @@ -180,4 +180,90 @@ function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number + + +### Solution 2: Dynamic Programming (Space Optimization) + +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)$. + +The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$. + + + +#### Python3 + +```python +class Solution: + def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int: + f, g = energyDrinkA[0], energyDrinkB[0] + for a, b in zip(energyDrinkA[1:], energyDrinkB[1:]): + f, g = max(f + a, g), max(g + b, f) + return max(f, g) +``` + +#### Java + +```java +class Solution { + public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) { + int n = energyDrinkA.length; + long f = energyDrinkA[0], g = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + long ff = Math.max(f + energyDrinkA[i], g); + g = Math.max(g + energyDrinkB[i], f); + f = ff; + } + return Math.max(f, g); + } +} +``` + +#### C++ + +```cpp +class Solution { +public: + long long maxEnergyBoost(vector& energyDrinkA, vector& energyDrinkB) { + int n = energyDrinkA.size(); + long long f = energyDrinkA[0], g = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + long long ff = max(f + energyDrinkA[i], g); + g = max(g + energyDrinkB[i], f); + f = ff; + } + return max(f, g); + } +}; +``` + +#### Go + +```go +func maxEnergyBoost(energyDrinkA []int, energyDrinkB []int) int64 { + n := len(energyDrinkA) + f, g := energyDrinkA[0], energyDrinkB[0] + for i := 1; i < n; i++ { + f, g = max(f+energyDrinkA[i], g), max(g+energyDrinkB[i], f) + } + return int64(max(f, g)) +} +``` + +#### TypeScript + +```ts +function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number { + const n = energyDrinkA.length; + let [f, g] = [energyDrinkA[0], energyDrinkB[0]]; + for (let i = 1; i < n; ++i) { + [f, g] = [Math.max(f + energyDrinkA[i], g), Math.max(g + energyDrinkB[i], f)]; + } + return Math.max(f, g); +} +``` + + + + + diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.cpp b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.cpp new file mode 100644 index 0000000000000..6a93ff53ea426 --- /dev/null +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.cpp @@ -0,0 +1,13 @@ +class Solution { +public: + long long maxEnergyBoost(vector& energyDrinkA, vector& energyDrinkB) { + int n = energyDrinkA.size(); + long long f = energyDrinkA[0], g = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + long long ff = max(f + energyDrinkA[i], g); + g = max(g + energyDrinkB[i], f); + f = ff; + } + return max(f, g); + } +}; diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.go b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.go new file mode 100644 index 0000000000000..1a565d2efe2d3 --- /dev/null +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.go @@ -0,0 +1,8 @@ +func maxEnergyBoost(energyDrinkA []int, energyDrinkB []int) int64 { + n := len(energyDrinkA) + f, g := energyDrinkA[0], energyDrinkB[0] + for i := 1; i < n; i++ { + f, g = max(f+energyDrinkA[i], g), max(g+energyDrinkB[i], f) + } + return int64(max(f, g)) +} diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.java b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.java new file mode 100644 index 0000000000000..f846f5d69c8c3 --- /dev/null +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.java @@ -0,0 +1,12 @@ +class Solution { + public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) { + int n = energyDrinkA.length; + long f = energyDrinkA[0], g = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + long ff = Math.max(f + energyDrinkA[i], g); + g = Math.max(g + energyDrinkB[i], f); + f = ff; + } + return Math.max(f, g); + } +} diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.py b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.py new file mode 100644 index 0000000000000..d246ef97d9dae --- /dev/null +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.py @@ -0,0 +1,6 @@ +class Solution: + def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int: + f, g = energyDrinkA[0], energyDrinkB[0] + for a, b in zip(energyDrinkA[1:], energyDrinkB[1:]): + f, g = max(f + a, g), max(g + b, f) + return max(f, g) diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.ts b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.ts new file mode 100644 index 0000000000000..c4e176c6aac46 --- /dev/null +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution2.ts @@ -0,0 +1,8 @@ +function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number { + const n = energyDrinkA.length; + let [f, g] = [energyDrinkA[0], energyDrinkB[0]]; + for (let i = 1; i < n; ++i) { + [f, g] = [Math.max(f + energyDrinkA[i], g), Math.max(g + energyDrinkB[i], f)]; + } + return Math.max(f, g); +}