题解 | 买卖股票的最好时机(二)
买卖股票的最好时机(二)
https://www.nowcoder.com/practice/9e5e3c2603064829b0a0bbfca10594e9
1、解题思路
- 贪心算法:每次在价格上升时买入和卖出,累计所有上升区间的利润总和。这样可以将多次买卖的总利润最大化。一次遍历即可完成,时间复杂度 O(n),空间复杂度 O(1)。
- 动态规划:定义 dp[i][0] 表示第 i 天不持有股票时的最大利润。定义 dp[i][1] 表示第 i 天持有股票时的最大利润。状态转移方程: dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])最终答案为 dp[n-1][0]。
- 空间优化:由于 dp[i] 仅依赖于 dp[i-1],可以只用两个变量来存储状态,优化空间复杂度为 O(1)。
2、代码实现
C++(贪心算法)
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算最大收益 * @param prices int整型vector 股票每一天的价格 * @return int整型 */ int maxProfit(vector<int>& prices) { // write code here int profit = 0; for (int i = 1; i < prices.size(); ++i) { if (prices[i] > prices[i - 1]) { profit += prices[i] - prices[i - 1]; } } return profit; } };
C++(动态规划 + 空间优化)
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算最大收益 * @param prices int整型vector 股票每一天的价格 * @return int整型 */ int maxProfit(vector<int>& prices) { // write code here if (prices.empty()) { return 0; } int hold = -prices[0], cash = 0; for (int i = 1; i < prices.size(); ++i) { cash = max(cash, hold + prices[i]); hold = max(hold, cash - prices[i]); } return cash; } };
Java(贪心算法)
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算最大收益 * @param prices int整型一维数组 股票每一天的价格 * @return int整型 */ public int maxProfit (int[] prices) { // write code here int profit = 0; for (int i = 1; i < prices.length; i++) { if (prices[i] > prices[i-1]) { profit += prices[i] - prices[i-1]; } } return profit; } }
Java(动态规划 + 空间优化)
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算最大收益 * @param prices int整型一维数组 股票每一天的价格 * @return int整型 */ public int maxProfit (int[] prices) { // write code here if (prices.length == 0) return 0; int hold = -prices[0], cash = 0; for (int i = 1; i < prices.length; i++) { cash = Math.max(cash, hold + prices[i]); hold = Math.max(hold, cash - prices[i]); } return cash; } }
Python(贪心算法)
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 计算最大收益 # @param prices int整型一维数组 股票每一天的价格 # @return int整型 # class Solution: def maxProfit(self , prices: List[int]) -> int: # write code here profit = 0 for i in range(1, len(prices)): if prices[i] > prices[i-1]: profit += prices[i] - prices[i-1] return profit
Python(动态规划 + 空间优化)
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 计算最大收益 # @param prices int整型一维数组 股票每一天的价格 # @return int整型 # class Solution: def maxProfit(self , prices: List[int]) -> int: # write code here if not prices: return 0 hold, cash = -prices[0], 0 for i in range(1, len(prices)): cash = max(cash, hold + prices[i]) hold = max(hold, cash - prices[i]) return cash
3、复杂度分析
- 时间复杂度 O(n)
- 空间复杂度 O(1)