要问我这几天人去哪了~ 自然是——炒股去了!事实证明,会写股票问题的代码和会炒股完全是两码子事,还是安心当码农吧。
121. 买卖股票的最佳时机
本题因为感觉不用设置两个状态,只要记录下最小值和最大值就能得出答案,但也因为这个和后面的方法没对齐,所以可以看看我的思路,如果自己做的话还是按卡哥的方法去写会更好一些,这样和后面的方法相比较起来也更连贯。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<int> dp(n);
int max = INT_MIN;
dp[0] = prices[0];
if(n<=1){
return 0;
}
for(int i=1; i<n; i++){
dp[i] = min(dp[i-1], prices[i]);
if(prices[i] - dp[i] > max){
max = prices[i] - dp[i];
}
}
return max;
}
};
122.买卖股票的最佳时机II
之前贪心做过一遍本题,现在再做一遍dp,因为股票问题也算是一个初见杀问题,只要搞定初始化和递推设置,写起来并不难,所以本题做的也是挺顺利的。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n, vector<int>(2));
dp[0][0] = -prices[0];
dp[0][1] = 0;
for(int i=1; i<n; 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][0] + prices[i]);
}
return dp[n-1][1];
}
123. 买卖股票的最佳时机 III
本题相对来说上了点强度,不过对于二周目的我来说依旧是顷刻炼化,毫无难度。
只要大致知道应该设置出4个状态,以及初始化的时候把买的那两次设置为-prices[0],别的就都没什么好说了。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n, vector<int>(4));
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = -prices[0];
dp[0][3] = 0;
for(int i=1; i<n; i++){
dp[i][0] = max(dp[i-1][0], -prices[i]);
dp[i][1] = max(dp[i-1][1], dp[i][0] + prices[i]);
dp[i][2] = max(dp[i-1][2], dp[i][1] - prices[i]);
dp[i][3] = max(dp[i-1][3], dp[i][2] + prices[i]);
}
return max(dp[n-1][1], dp[n-1][3]);
}
};