题目:121. 买卖股票的最佳时机
文章链接:代码随想录
题目链接:力扣题目链接
图释:
// 暴力解法
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
// 找最大的间距
for(int i=0; i<prices.size(); i++){
for(int j=i+1; j<prices.size(); j++){
result = max(result, prices[j]-prices[i]);
}
}
return result;
}
};
// 贪心算法
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
int low = INT_MAX;
// 贪心解法,取左边的最小值,作为买入的时机
for(int i=0; i<prices.size(); i++){
low = min(low, prices[i]); // 价格
result= max(result, prices[i]-low); // 就是找到最小的,又重新开始计算盈利
// 如果在最小值之前就已经有盈利最大的情况时,也进行记录了
}
return result;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
if(len==0) return 0;
// dp[][]数组含义:dp[i][0]表示第i天持有股票所得最多现金, dp[i][1]表示第i天不持有股票所得最多现金
vector<vector<int>> dp(len, vector<int>(2)); // dp[i][0]持有 ;dp[i][1]不持有
// 初始化 第0天
dp[0][0] = -prices[0]; //持有,则是拿钱去买股票
dp[0][1] = 0; // 不持有
for(int i=1; i<len ;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[len-1][1];
}
};
题目:122.买卖股票的最佳时机II
文章链接:代码随想录
题目链接:力扣题目链接
图释:
// 贪心算法
class Solution {
public:
int maxProfit(vector<int>& prices) {
// 查看每天的收益情况,从每天都正向获利推到全局最优
int result = 0;
for(int i=1; i<prices.size(); i++){
result += max(prices[i]-prices[i-1], 0);
}
return result;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
if(len==0) return 0;
// dp[][]数组含义:dp[i][0]表示第i天持有股票所得最多现金, dp[i][1]表示第i天不持有股票所得最多现金
vector<vector<int>> dp(len, vector<int>(2)); // dp[i][0]持有 ;dp[i][1]不持有
// 初始化 第0天
dp[0][0] = -prices[0]; //持有,则是拿钱去买股票
dp[0][1] = 0; // 不持有
for(int i=1; i<len ;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[len-1][1];
}
};