题目来源:链接: [https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/]
121. 买卖股票的最佳时机
1.问题描述
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
示例1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,
最大利润 = 6-1 = 5 。
注意:利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
2.我的解决方案
easy 类型题目。
最先想到的肯定是暴力法。
暴力法AC代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int max = 0;
for(int i = 0; i < prices.size(); ++i)
{
for(int j = i + 1; j < prices.size(); ++j)
{
if(prices[j] - prices[i] > max)
{
max = prices[j] - prices[i];
}
}
}
return max;
}
};
3.大神们的解决方案
方法:(DP 动态规划)
动态规划 前i天的最大收益 = max { 前i-1天的最大收益,第i天的价格-前i-1天中的最小价格 }
mini记录当前的最便宜的股票
res记录当前最大利润
对于第i天的股票(prices[i]):
res = max(res , prices[i]-mini)
mini = min(mini, prices[i] ) // 更新mini
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() < 2) return 0;
int mini = prices[0];
int res = 0;
for(int i = 1; i < prices.size(); ++i)
{
res = max(res, prices[i] - mini);
mini = min(mini, prices[i]);
}
return res;
}
};
PS:但是实际提交的时候下面这个方法速度更快:
此方法也是动态规划的思想。代码大同小异。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int maxres=0;
int size=prices.size();
if(size==0) return 0;
int temp=prices[0];
for(int i=1;i<size;i++)
{
int diff=prices[i]-temp;
if(diff>=0)
{
maxres=max(maxres,diff);
}else
{
temp=prices[i];
}
}
return maxres;
}
};
4.我的收获
又是动态规划。。。
2019/4/28 胡云层 于南京 68