16. 123. 买股票的最佳时机3
题目:
给定一个数组,它的第
i
个元素是一支给定的股票在第i
天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
题目链接
文字分析
代码
class Solution { public: int maxProfit(vector<int>& prices) { int n = prices.size(); vector<vector<int>> f(n,vector<int>(3)); vector<vector<int>> g(n,vector<int>(3)); f[0][0] = prices[0] * -1; f[0][1] = prices[0] * -1;; f[0][2] = prices[0] * -1;; for(int i = 1;i < n;i++) { for(int j = 0;j < 3;j++) { f[i][j] = max(f[i - 1][j],g[i - 1][j] - prices[i]); g[i][j] = g[i - 1][j]; if(j - 1 >= 0) { g[i][j] = max(g[i][j],f[i - 1][j - 1] + prices[i]); } } } int Max = g[n - 1][0]; for(int j = 0;j < 3;j++) { Max = max(Max,g[n - 1][j]); } return Max; } };
17. 188. 买股票的最佳时机4
题目:
给你一个整数数组
prices
和一个整数k
,其中prices[i]
是某支给定的股票在第i
天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成
k
笔交易。也就是说,你最多可以买k
次,卖k
次。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
题目链接
文字分析
原理 和 16 买股票的最佳时机3 一样,可以参考
代码
class Solution { public: int maxProfit(int k, vector<int>& prices) { int n = prices.size(); vector<vector<int>> f(n,vector<int>(k + 1)); vector<vector<int>> g(n,vector<int>(k + 1)); for(int i = 0;i <= k;i++) { f[0][i] = prices[0] * -1; } for(int i = 1;i < n;i++) { for(int j = 0;j <= k;j++) { f[i][j] = max(f[i - 1][j],g[i - 1][j] - prices[i]); g[i][j] = g[i - 1][j]; if(j - 1 >= 0) { g[i][j] = max(g[i][j],f[i - 1][j - 1] + prices[i]); } } } int Max = g[n - 1][0]; for(int j = 0;j <= k;j++) { Max = max(Max,g[n - 1][j]); } return Max; } };
18. 53 . 最大子数组和
题目:
给你一个整数数组
nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。
题目链接
文字分析
代码
class Solution { public: int maxSubArray(vector<int>& nums) { int n = nums.size(); vector<int> dp(n); int Max = dp[0] = nums[0]; for(int i = 1;i < n;i++) { dp[i] = max(nums[i],dp[i - 1] + nums[i]); Max = max(Max,dp[i]); } return Max; } };