LeetCode122. Best Time to Buy and Sell Stock II题解

来源:互联网 发布:淘宝退货退款流程图 编辑:程序博客网 时间:2024/05/19 15:21

今天讨论一道让我想的过于复杂的题目:一道有关股票买卖的问题。

1. 题目描述

Say you have an array for which the i th element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
【翻译过来】:
给一个数组,这个数组里面第i个元素代表第i天的股票价格(肯定是一个非负数啦),需要我们设计能够获得最大利润的算法。
这样的算法:在合适的时间买卖赚取差价从而获得利润,可以对股票进行多次买卖,但是每一次买这支股票的时候要保证首先已经卖出去了,即:在重新购买之前必须卖掉。

2. 分析

刚开始我想的过于复杂了:认为只能得到当天的股票价格和之前的股票价格,在此基础之上设计获得最大利润的算法。我如果能设计出来,那就发大财啦!实际上,允许你知道后面的股票价格,即我们可以预先看到后面的股票价格。
于是,我选择了使用贪心算法:我们进行数组中的两两比较:如果后面一天的价格高于前面的价格,就买入,然后在第二天卖出,利润就是这两天的差价。
翻译过来:我们查看当前一天的价格和后一天的价格,如果当前一天低于后一天价格,我们本着【低价买入高价售出】的原则,选择在这一天买入,然后在第二天卖出,然后继续比较第二天的价格和第三天的价格,如果仍然出现第三天高于第二天的情况,就在第二天继续买入,第三天卖出,利润是一样的。
【例子1】:
例如这个数组是:

[5,1,2,3,4]

我们检查:
第一天价格是5,第二天价格是1,第一天价格高于第二天,赔本的生意不做,不买;
第二天价格是1,第三天价格是2,第三天价格高于第二天,可以第二天买第三天卖,赚1元;
第三天价格是2,第四天价格是3,第四天价格高于第三天,可以第三天买第四天卖,赚1元;
第四天价格是3,第五天价格是4,第五天价格高于第四天,可以第四天买第五天卖,赚1元;
于是总利润是:1+1+1 = 3
这样与第二天买,第五天卖,利润:4-1 = 3相同
这里写图片描述
【例子2】:
例如这个数组是:

[5,1,2,3,1]

我们检查:
第一天价格是5,第二天价格是1,第二天价格低于第一天,赔本的生意不做,不买;
第二天价格是1,第三天价格是2,第三天价格高于第二天,可以第二天买第三天卖,赚1元;
第三天价格是2,第四天价格是3,第四天价格高于第三天,可以第三天买第四天卖,赚1元;
第四天价格是3,第五天价格是1,第五天价格低于第四天,赔本的生意不做,不买;
于是总利润是:1+1 = 2
这里写图片描述
【总结】:
我们的贪心算法保证:目前获得的利润最大:买股票的价格一定要小于等于下一天的价格,这样才保证不会亏钱,每一步的利润就是第二天高价售出和头一天低价买入之间的差值。
这里写图片描述

3. 源码

#include <iostream>#include <vector>using namespace std;int maxProfit(vector<int>& prices);int main() {    vector<int> prices;    prices.push_back(5);    prices.push_back(1);    prices.push_back(2);    prices.push_back(3);    prices.push_back(1);    int result = maxProfit(prices);    cout << "Total profit: " << result << endl;    return 0;}int maxProfit(vector<int>& prices) {    int maxProfit = 0;    for (int i = 0; i < (int)prices.size()-1; i++) {        if (prices[i+1] - prices[i] >= 0) {            cout << "Buy on day " << i+1 << endl;            cout << "Sell on day " << i+2 << endl;            maxProfit += prices[i+1] - prices[i];            cout << "current profit: " << prices[i+1] - prices[i] << endl;        }    }    return maxProfit;}

4. 心得

完全理解题目后就很容易了,使用贪心算法即可。贪心算法的应用在这里的策略总结起来就是:步步为营,稳扎稳打,每一步骤都力求当前利润最大化即可,并没有从整个全局来看。
但是话说回来,在现实生活中应该没有人预先知道第二天的股票价格,知道的话那就稳赚不赔啦。不过这倒是给了我们投资的一个建议:见好就收,来日方长。

0 0
原创粉丝点击