121买卖股票的最佳时机
链接:LeetCode121买卖股票的最佳时机
题目中“只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票”的意思是说,只能拥有一只股票,在某一天拥有,在不同的一天卖出。
第一版
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> dpin(prices.size(),0);//记录0-i天中最低的买入价格
dpin[0] = prices[0];
vector<int> dpout(prices.size(),0);//记录0-i天中最高的利润
int ans = 0;
for(int i=1;i<prices.size();++i){
dpin[i] = min(dpin[i-1],prices[i]);
dpout[i] = prices[i] - dpin[i-1];
ans = ans>dpout[i]?ans:dpout[i];
}
return ans;
}
};
第二版
class Solution {
public:
int maxProfit(vector<int>& prices) {
//dp[i][0]表示0-i天中买入的最低价格,dp[i][1]表示0-i天中卖出的最高利润
vector<vector<int>> dp(prices.size(),vector<int>(2,0));
dp[0][0] = prices[0];
int ans = 0;
for(int i=1;i<prices.size();++i){
dp[i][0] = min(dp[i-1][0],prices[i]);
dp[i][1] = prices[i] - dp[i-1][0];
ans = ans>dp[i][1]?ans:dp[i][1];
}
return ans;
}
};
优化
class Solution {
public:
int maxProfit(vector<int>& prices) {
//dp[i][0]表示0-i天中买入的最低价格,dp[i][1]表示0-i天中卖出的最高利润
vector<int> dp(prices.size(),0);
int in = prices[0];
int ans = 0;
for(int i=1;i<prices.size();++i){
dp[i] = prices[i] - in;
in = min(in,prices[i]);
ans = ans>dp[i]?ans:dp[i];
}
return ans;
}
};
刚开始写该题的时候,我采用的是两个for循环,第一个循环记录卖出股票的那一天,第二个循环记录前一天买入股票的那一天,两个循环游标指向的价格做减法得出买卖股票的利润。时间复杂度为O(n^2),当数据量很大的时候会超出时间限制范围。所以以上两版代码对获取0-i天最低的买入价格做了一个优化,将其放入一个dp数组当中,将两个for循环优化为一个for循环。
122买卖股票的最佳时机||
贪心
class Solution {
public:
int maxProfit(vector<int>& prices) {
int sum = 0;
for(int i=1;i<prices.size();++i){
int dis = prices[i]-prices[i-1];
sum = dis>0?sum+dis:sum;
}
return sum;
}
};
动态规划
本题“在每一天,可以决定是否购买 ’和\或‘ 出售股票,任何时候最多只能持有一股股票,可以先购买,然后在同一天售出,或者之后的某一天售出。“ 相比于”121.买卖股票的最佳时机“本题可以不同时拥有多只股票。
动规五部曲
- 确定dp数组下标及含义。dp[i]表示0-i天中买入卖出获取的最高利润。(由于可多次持股,所以利润可以累加)
- 确定递推公式。if(prices[i]-prices[i-1] > 0)dp[i] = dp[i-1] +prices[i] - prices[i-1];
- 数组初始化。dp[0] = 0;
- 确定遍历顺序。从前往后遍历
- 举例推导dp数组。
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> dp(prices.size(),0);
int ans = 0;
for(int i=1;i<prices.size();++i){
int dis = prices[i] - prices[i-1];
dp[i] = dp[i-1] + (dis>0?dis:0);
ans = ans>dp[i]?ans:dp[i];
}
return ans;
}
};