题目:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
1. 解题思路分析:
这道题首先想到的最简单的办法就是暴力求解,用两个for循环解决,但是这种方法在数据量比较大的测试样例中会超时,所以在本篇就主要介绍贪心算法求解买卖股票的最佳时机。
1.首先介绍一下贪心算法是什么
“贪心算法是一种寻找最优解问题的常用方法。它的基本思想是,从问题的某个初始解出发,通过一系列的局部最优选择,得到一个全局最优解。贪心算法每一步都按照某种指标选取最优的操作,而不考虑以后可能造成的影响。贪心算法可以简单描述为:大事化小,小事化了。”(以上介绍是从百度里摘抄的)
2. 本题为什么能用贪心算法,以及如何使用呢?
这道题有个很大的特点就是:买卖股票的时候,是有时间先后限制的。股票要先购买才能卖出,所以在遍历股票数组的时候,是只能按照从前往后的顺序遍历。
就比如说你买股票的时候,你只能知道历史和今天的情况,不知道以后的情况,这种时候就可以使用贪心算法了,也就是只需要算出,【历史以来(直到当天)的最大利润值】和【历史上的股票最小值】。
解释一下为什么需要知道这两个值:【最大利润值】是题目问的,所以肯定要有;【历史上股票最小值】可以是用来辅助计算‘当天可以获得的最大利润值’,然后【最大利润值】就由‘历史最大利润值’和‘当天最大利润值’比较选择更大的一方,所以这两个值都需要有。
2. 附代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
int minprice=1e9;
int maxpro=0;
for(int i=0;i<prices.size();i++)
{
minprice=min(minprice,prices[i]);
maxpro=max(maxpro,prices[i]-minprice);
}
return maxpro;
}
};