LeetCode 123: Best Time to Buy and Sell Stock 3 解题与思考

来源:互联网 发布:索金十数据官网 编辑:程序博客网 时间:2024/06/06 03:11

LeetCode 123: Best Time to Buy and Sell Stock 3 解题与思考

[原题链接]

题目描述

这次你只能买两次,依旧需要先抛掉手上的才能买下一只,求最大利润

思路

可以先将数列切割成两部分,我在左边获得的最大利润加上右边的最大利润,其最大值则为所求。

也就是说可以变成两个LeetCode 121求解。

不过要注意的是直接调用121的函数会超时,所以还要稍微作修改。

我们在121中使用的是从左到右扫,记录股票价格最小值min以及最大利润PA;在这道题中,我们可以建立数组An,记录从左开始到第n个数所能得到的最大利润。而实际上就是在扫描的时候顺带将PA压入栈A。这样我们就能得到左半边的最大利润状况数组。

对于右半边,我们对应的,建立数组Bn,记录从右边到左边第n个数所能得到的最大利润;记录股票价格最大值max以及最大利润PB;每一次扫描更新P和max,并将PB压入栈B。

最后,最大利润满足

P=max(Ai+Bni)

算法

1、初始化最大利润PA = 0,最小数字min为第一个数,建立空栈A;
2、顺序扫描整个数组;当扫到一个新的数ai时,

  • aimin>PA,则PA=aimin
  • ai<min,则min=ai

3、将PA压入栈A

4、初始化最大利润PB = 0,最大数字max为最后一个数,建立空栈B;
5、逆序扫描整个数组;当扫到一个新的数ai时,

  • maxai>PB,则PB=maxai
  • ai>max,则max=ai

6、将PB压入栈B

7、计算

P=max(Ai+Bni)

P即为所求

代码

#include <iostream>#include <vector>using namespace std;class Solution {public:    int maxProfit(vector<int>& prices) {        if ( prices.size() == 0 ) return 0;        vector<int> A, B;        int P = 0;        int Ptemp, m;        Ptemp = 0;        m = prices[0];        for ( auto i = prices.begin(); i != prices.end(); i++ ) {            int profit = *i - m;            if ( Ptemp <  profit) Ptemp = profit;            if ( *i < m ) m = *i;            A.push_back(Ptemp);        }        Ptemp = 0;        m = prices.back();        for ( auto i = prices.end() - 1; i >= prices.begin(); i-- ) {            int profit = m - *i;            if ( Ptemp <  profit ) Ptemp = profit;            if ( *i > m ) m = *i;            B.push_back(Ptemp);        }        int n = prices.size();        for ( int i = 0; i < n; i++ ) {            int profit = A[i] + B[n - 1 - i];            if ( P < profit ) P = profit;        }        return P;    }};

思考

毕竟是hard的题目,对时间的要求方面还是需要相当严谨的

阅读全文
0 0