代码随想录算法训练营第四十九天 | 121. 买卖股票的最佳时机、22. 买卖股票的最佳时机 II
- 121. 买卖股票的最佳时机
- 题目
- 解法
- 122. 买卖股票的最佳时机 II
- 题目
- 解法
- 感悟
121. 买卖股票的最佳时机
题目
解法
题解链接
- 没看题解想出来的:贪心
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> dp(prices.size());// 可以换成 int result = 0;
dp[0] = 0;
int minPrice = prices[0];
for(int i = 1; i < prices.size(); i++){
dp[i] = max(prices[i] - minPrice, dp[i-1]); //result = max(prices[i] - minPrice, result);
minPrice = min(minPrice, prices[i]);
}
return dp[prices.size()-1];
}
};
时间复杂度:O( n)
空间复杂度:O(n ) // 第二种方法 为O(1)
2.动态规划
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() == 0) return 0;
vector<vector<int>> dp(prices.size(), vector<int>(2));
dp[0][0] = -prices[0];// 持有
dp[0][1] = 0; // 不持有
for(int i = 1; i < prices.size(); i++){
dp[i][0] = max(dp[i-1][0], -prices[i]);
dp[i][1] = max(dp[i-1][1] , dp[i-1][0] + prices[i] );
}
return dp[prices.size()-1][1];
}
};
时间复杂度:O(n )
空间复杂度:O(n )
122. 买卖股票的最佳时机 II
题目
解法
题解链接
- 动态规划
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() == 0) return 0;
vector<vector<int>> dp(prices.size(), vector<int>(2));
dp[0][0] = -prices[0];// 持有
dp[0][1] = 0; // 不持有
for(int i = 1; i < prices.size(); 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] );
}
return dp[prices.size()-1][1];
}
};
时间复杂度:O(n )
空间复杂度:O( n)
2.滚动数组
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() == 0) return 0;
vector<vector<int>> dp(2, vector<int>(2));
dp[0][0] = -prices[0];// 持有
dp[0][1] = 0; // 不持有
for(int i = 1; i < prices.size(); i++){
dp[i%2][0] = max(dp[(i-1)%2][0], dp[(i-1)%2][1] - prices[i]);
dp[i%2][1] = max(dp[(i-1)%2][1] , dp[(i-1)%2][0] + prices[i] );
}
return dp[(prices.size()-1)%2][1];
}
};
时间复杂度:O( n)
空间复杂度:O(1 )
感悟
有时候贪心确实挺好用