From 05cb321040b7006b23ed74bfc5d7cabe4ad906ba Mon Sep 17 00:00:00 2001 From: yanglbme Date: Mon, 19 Aug 2024 22:21:27 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.3259 No.3259.Maximum Energy Boost From Two Drinks --- .../README.md | 83 ++++++++++++++++++- .../README_EN.md | 83 ++++++++++++++++++- .../Solution.cpp | 14 ++++ .../Solution.go | 11 +++ .../Solution.java | 13 +++ .../Solution.py | 10 +++ .../Solution.ts | 11 +++ 7 files changed, 217 insertions(+), 8 deletions(-) create mode 100644 solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.cpp create mode 100644 solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.go create mode 100644 solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.java create mode 100644 solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.py create mode 100644 solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.ts 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 dc9ec9bfa87a8..a67c4da79fa45 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 @@ -68,32 +68,107 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3200-3299/3259.Ma -### 方法一 +### 方法一:动态规划 + +我们定义 $f[i][0]$ 表示在第 $i$ 小时选择能量饮料 A 获得的最大强化能量,定义 $f[i][1]$ 表示在第 $i$ 小时选择能量饮料 B 获得的最大强化能量。初始时 $f[0][0] = \textit{energyDrinkA}[0]$, $f[0][1] = \textit{energyDrinkB}[0]$。答案为 $\max(f[n - 1][0], f[n - 1][1])$。 + +对于 $i > 0$,我们有以下状态转移方程: + +$$ +\begin{aligned} +f[i][0] & = \max(f[i - 1][0] + \textit{energyDrinkA}[i], f[i - 1][1]) \\ +f[i][1] & = \max(f[i - 1][1] + \textit{energyDrinkB}[i], f[i - 1][0]) +\end{aligned} +$$ + +最后返回 $\max(f[n - 1][0], f[n - 1][1])$ 即可。 + +时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组的长度。 #### Python3 ```python - +class Solution: + def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int: + n = len(energyDrinkA) + f = [[0] * 2 for _ in range(n)] + f[0][0] = energyDrinkA[0] + f[0][1] = energyDrinkB[0] + for i in range(1, n): + f[i][0] = max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]) + f[i][1] = max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]) + return max(f[n - 1]) ``` #### Java ```java - +class Solution { + public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) { + int n = energyDrinkA.length; + long[][] f = new long[n][2]; + f[0][0] = energyDrinkA[0]; + f[0][1] = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + f[i][0] = Math.max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]); + f[i][1] = Math.max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]); + } + return Math.max(f[n - 1][0], f[n - 1][1]); + } +} ``` #### C++ ```cpp - +class Solution { +public: + long long maxEnergyBoost(vector& energyDrinkA, vector& energyDrinkB) { + int n = energyDrinkA.size(); + vector> f(n, vector(2)); + f[0][0] = energyDrinkA[0]; + f[0][1] = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + f[i][0] = max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]); + f[i][1] = max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]); + } + return max(f[n - 1][0], f[n - 1][1]); + } +}; ``` #### Go ```go +func maxEnergyBoost(energyDrinkA []int, energyDrinkB []int) int64 { + n := len(energyDrinkA) + f := make([][2]int64, n) + f[0][0] = int64(energyDrinkA[0]) + f[0][1] = int64(energyDrinkB[0]) + for i := 1; i < n; i++ { + f[i][0] = max(f[i-1][0]+int64(energyDrinkA[i]), f[i-1][1]) + f[i][1] = max(f[i-1][1]+int64(energyDrinkB[i]), f[i-1][0]) + } + return max(f[n-1][0], f[n-1][1]) +} +``` +#### TypeScript + +```ts +function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number { + const n = energyDrinkA.length; + const f: number[][] = Array.from({ length: n }, () => [0, 0]); + f[0][0] = energyDrinkA[0]; + f[0][1] = energyDrinkB[0]; + for (let i = 1; i < n; i++) { + f[i][0] = Math.max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]); + f[i][1] = Math.max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]); + } + return Math.max(...f[n - 1]!); +} ``` 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 9d3e37f4b7668..994ac6e608ab3 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 @@ -68,32 +68,107 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3200-3299/3259.Ma -### Solution 1 +### Solution 1: Dynamic Programming + +We define $f[i][0]$ to represent the maximum boost energy obtained by choosing energy drink A at the $i$-th hour, and $f[i][1]$ to represent the maximum boost energy obtained by choosing energy drink B at the $i$-th hour. Initially, $f[0][0] = \textit{energyDrinkA}[0]$, $f[0][1] = \textit{energyDrinkB}[0]$. The answer is $\max(f[n - 1][0], f[n - 1][1])$. + +For $i > 0$, we have the following state transition equations: + +$$ +\begin{aligned} +f[i][0] & = \max(f[i - 1][0] + \textit{energyDrinkA}[i], f[i - 1][1]) \\ +f[i][1] & = \max(f[i - 1][1] + \textit{energyDrinkB}[i], f[i - 1][0]) +\end{aligned} +$$ + +Finally, return $\max(f[n - 1][0], f[n - 1][1])$. + +The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the array. #### Python3 ```python - +class Solution: + def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int: + n = len(energyDrinkA) + f = [[0] * 2 for _ in range(n)] + f[0][0] = energyDrinkA[0] + f[0][1] = energyDrinkB[0] + for i in range(1, n): + f[i][0] = max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]) + f[i][1] = max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]) + return max(f[n - 1]) ``` #### Java ```java - +class Solution { + public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) { + int n = energyDrinkA.length; + long[][] f = new long[n][2]; + f[0][0] = energyDrinkA[0]; + f[0][1] = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + f[i][0] = Math.max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]); + f[i][1] = Math.max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]); + } + return Math.max(f[n - 1][0], f[n - 1][1]); + } +} ``` #### C++ ```cpp - +class Solution { +public: + long long maxEnergyBoost(vector& energyDrinkA, vector& energyDrinkB) { + int n = energyDrinkA.size(); + vector> f(n, vector(2)); + f[0][0] = energyDrinkA[0]; + f[0][1] = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + f[i][0] = max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]); + f[i][1] = max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]); + } + return max(f[n - 1][0], f[n - 1][1]); + } +}; ``` #### Go ```go +func maxEnergyBoost(energyDrinkA []int, energyDrinkB []int) int64 { + n := len(energyDrinkA) + f := make([][2]int64, n) + f[0][0] = int64(energyDrinkA[0]) + f[0][1] = int64(energyDrinkB[0]) + for i := 1; i < n; i++ { + f[i][0] = max(f[i-1][0]+int64(energyDrinkA[i]), f[i-1][1]) + f[i][1] = max(f[i-1][1]+int64(energyDrinkB[i]), f[i-1][0]) + } + return max(f[n-1][0], f[n-1][1]) +} +``` +#### TypeScript + +```ts +function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number { + const n = energyDrinkA.length; + const f: number[][] = Array.from({ length: n }, () => [0, 0]); + f[0][0] = energyDrinkA[0]; + f[0][1] = energyDrinkB[0]; + for (let i = 1; i < n; i++) { + f[i][0] = Math.max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]); + f[i][1] = Math.max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]); + } + return Math.max(...f[n - 1]!); +} ``` diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.cpp b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.cpp new file mode 100644 index 0000000000000..a2ba2fbc70fd1 --- /dev/null +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.cpp @@ -0,0 +1,14 @@ +class Solution { +public: + long long maxEnergyBoost(vector& energyDrinkA, vector& energyDrinkB) { + int n = energyDrinkA.size(); + vector> f(n, vector(2)); + f[0][0] = energyDrinkA[0]; + f[0][1] = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + f[i][0] = max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]); + f[i][1] = max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]); + } + return max(f[n - 1][0], f[n - 1][1]); + } +}; diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.go b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.go new file mode 100644 index 0000000000000..f372dd70a1d5b --- /dev/null +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.go @@ -0,0 +1,11 @@ +func maxEnergyBoost(energyDrinkA []int, energyDrinkB []int) int64 { + n := len(energyDrinkA) + f := make([][2]int64, n) + f[0][0] = int64(energyDrinkA[0]) + f[0][1] = int64(energyDrinkB[0]) + for i := 1; i < n; i++ { + f[i][0] = max(f[i-1][0]+int64(energyDrinkA[i]), f[i-1][1]) + f[i][1] = max(f[i-1][1]+int64(energyDrinkB[i]), f[i-1][0]) + } + return max(f[n-1][0], f[n-1][1]) +} diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.java b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.java new file mode 100644 index 0000000000000..d9de09299032f --- /dev/null +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.java @@ -0,0 +1,13 @@ +class Solution { + public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) { + int n = energyDrinkA.length; + long[][] f = new long[n][2]; + f[0][0] = energyDrinkA[0]; + f[0][1] = energyDrinkB[0]; + for (int i = 1; i < n; ++i) { + f[i][0] = Math.max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]); + f[i][1] = Math.max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]); + } + return Math.max(f[n - 1][0], f[n - 1][1]); + } +} diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.py b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.py new file mode 100644 index 0000000000000..d79c9da59d159 --- /dev/null +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.py @@ -0,0 +1,10 @@ +class Solution: + def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int: + n = len(energyDrinkA) + f = [[0] * 2 for _ in range(n)] + f[0][0] = energyDrinkA[0] + f[0][1] = energyDrinkB[0] + for i in range(1, n): + f[i][0] = max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]) + f[i][1] = max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]) + return max(f[n - 1]) diff --git a/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.ts b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.ts new file mode 100644 index 0000000000000..f8b26a4e3d11a --- /dev/null +++ b/solution/3200-3299/3259.Maximum Energy Boost From Two Drinks/Solution.ts @@ -0,0 +1,11 @@ +function maxEnergyBoost(energyDrinkA: number[], energyDrinkB: number[]): number { + const n = energyDrinkA.length; + const f: number[][] = Array.from({ length: n }, () => [0, 0]); + f[0][0] = energyDrinkA[0]; + f[0][1] = energyDrinkB[0]; + for (let i = 1; i < n; i++) { + f[i][0] = Math.max(f[i - 1][0] + energyDrinkA[i], f[i - 1][1]); + f[i][1] = Math.max(f[i - 1][1] + energyDrinkB[i], f[i - 1][0]); + } + return Math.max(...f[n - 1]!); +}