121.[Leetcode]Best Time to Buy and Sell Stock

题意 :

给你一串股票数字,你有一次的买入和卖出的机会,求最大的收益(卖出-买入)是多少?

我的思路:

一开始想的是双循环,果断超时。查询了一下

这里要用到动态规划的思想:

那么什么是动态规划呢?

动态规划(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 (到目前为止的最低价)

为什么是到目前为止的最低价可看下图:

121.[Leetcode]Best Time to Buy and Sell Stock_第1张图片

从这张简陋的图表中我们可以看出,要计算 第 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;
    }
};

你可能感兴趣的:(LeetCode)