题意 :
给你一串股票数字,你有一次的买入和卖出的机会,求最大的收益(卖出-买入)是多少?
我的思路:
一开始想的是双循环,果断超时。查询了一下
这里要用到动态规划的思想:
那么什么是动态规划呢?
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法
把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解 。也就是拆分问题
一下以理解题目为先,对动态规划的理解不到位的地方望海涵,本人是渣:
首先只有1天的情况可以看作是 第1天买入,第1天卖出,此时的最大收益为
ans1 = p1(第一天卖出价格)- p1(目前为止的最低价) = 0
然后再第1天的基础上我们来看 有2天 的情况下;
如果还在第一天卖出,最大收益 = ans1是不会改变的,如果在第二天卖出的最大收益ans2 > ans1,最大收益改变。ans2如何求呢?
ans2 = p2(第二天的价格)-p1(目前为止的最低价)
如果 ans2 > ans1,则更新我们的最大收益
同理,当3天的情况也是如此。
那么我们可以想到,第 i 天的最大收益如何计算呢?
ansi = pi(第i天的价格) - p_low (到目前为止的最低价)
为什么是到目前为止的最低价可看下图:
从这张简陋的图表中我们可以看出,要计算 第 i 天卖出时,可获得的最大收益,我们只要计算出 需要 prices[i] 即当前的价格,还需要 low 用来表示 当前情况下的最小股票值
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.empty()) return 0; //还有一定要注意边界情况
vector<int>::iterator it;
int low = prices.front(),ans = 0;
for (it = prices.begin();it!=prices.end();it++) {
if(*it < low) low = *it; // 首先计算出当前情况下的最小值--low
if(*it-low > ans) ans = *it-low; // 判断 ans i 是否大于 ans,是,则更新ans
}
return ans;
}
};