列表

详情


XM3. 风口的猪-中国牛市

描述

风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100

示例1

输入:

3,8,5,1,7,8

输出:

12

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2021-03-07

class Solution {
public:
    /**
     * 计算你能获得的最大收益
     * 
     * @param prices Prices[i]即第i天的股价
     * @return 整型
     */
    
    int calculateMax(vector<int> prices) {
         int n = prices.size();

        if(n < 2) return 0;
        else if(n == 2) return max(0, prices[1] - prices[0]);
        /*hxsy[i]表示第i天结束时为处于有x支股票,卖出了y支股票的状态下最大收益是多少。*/
        int h0s0[n], h1s0[n], h0s1[n], h1s1[n];
        memset(h0s0, 0, sizeof h0s0);
        memset(h1s0, 0, sizeof h1s0);
        memset(h0s1, 0, sizeof h0s1);
        memset(h1s1, 0, sizeof h1s1);
        /*下面的初始化非常重要,因为你做了状态限制,而为了达到某些状态比如h1s1[2],在第2天是确定的
        正的就是正的,负的就是负的,不能去优化它或怎么样;
        不初始化那它就是0,是和实际状态不符合的。*/
        h0s0[0] = 0;
        h1s0[0] = -prices[0];
        h0s1[1] = prices[1] - prices[0];
        h1s1[2] = -prices[2] + prices[1] - prices[0];
        int res = 0;
        for(int i = 1; i < n; i++){
            h0s0[i] = h0s0[i - 1];
            h1s0[i] = max(h1s0[i - 1], h0s0[i - 1] - prices[i]);
            h0s1[i] = max(h0s1[i - 1], h1s0[i - 1] + prices[i]);
            res = max(res, h0s1[i]);
            if(i >= 3) h1s1[i] = max(h1s1[i - 1], h0s1[i - 1] - prices[i]);
            if(i >= 3){
                res = max(res, h1s1[i - 1] + prices[i]);
            }
//             cout<<i<<" -> "<<h0s0[i]<<" "<<h1s0[i]<<" "<<h0s1[i]<<" "<<h1s1[i]<<endl;
        }
        return res;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-12-23

class Solution {
public:
    /**
     * 计算你能获得的最大收益
     * 
     * @param prices Prices[i]即第i天的股价
     * @return 整型
     */
    int calculateMax(vector<int> prices) {
        int dp[4];
        for(int i = 0; i < 4; i++) dp[i] = -prices[0];
        for(int i = 0; i < prices.size(); i++){
            dp[3] = max(dp[3], dp[2]+prices[i]);
            dp[2] = max(dp[2], dp[1]-prices[i]);
            dp[1] = max(dp[1], dp[0]+prices[i]);
            dp[0] = max(dp[0], -prices[i]);     
        }
        return dp[3];
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-08-25

class Solution {
public:
    /**
     * 计算你能获得的最大收益
     * 
     * @param prices Prices[i]即第i天的股价
     * @return 整型
     */
    int calculateMax(vector<int> prices) {
        int first_buy_price=INT_MAX;
        int first_sell_price=INT_MIN;
        int second_buy_price=INT_MIN;
        int second_sell_price=INT_MIN;
        for(int i=0;i<prices.size();++i){
            first_buy_price=min(first_buy_price,prices[i]);
            first_sell_price=max(first_sell_price,-first_buy_price+prices[i]);
            second_buy_price=max(second_buy_price,first_sell_price-prices[i]);
            second_sell_price=max(second_sell_price,second_buy_price+prices[i]);
        }
        return second_sell_price;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 408KB, 提交时间: 2021-07-29

class Solution {
public:
    /**
     * 计算你能获得的最大收益
     * 
     * @param prices Prices[i]即第i天的股价
     * @return 整型
     */
    int calculateMax(vector<int> prices) {
        int i,mr1 = 1000,max1=0,mr2 = -1000,max2=0;
//强开上帝视角解法,即不断循环,人只能选择一次买入卖出时间,上帝可不断变换,根据当天股市情况调整自己之前的操作!
        for(i=0;i<prices.size();i++){
//第一次可买入的最低损失,损失少了也就相当于受益多,即抄底购入。
            if( prices[i] < mr1 )//妈的,价格竟然比我第一次买的时候便宜,应该此时才买,损失更少。
                mr1 = prices[i];
//若不购入的话,看看会不会是股票涨了,且涨幅获利大于上次的获利?趁机卖掉?
            else if( prices[i] - mr1 > max1 )//牛逼,涨了,卖掉。
                max1 = prices[i] - mr1;
//假设此时我们将第一次的股票已经抛掉,并在此刻购入,最低损失多少可购入。
            if( max1 - prices[i] > mr2 )//挣了点小钱,找个价钱低的时候再次买入
                mr2 = max1 - prices[i];
//第二次卖出可能获益的最大收入
            else if( mr2 + prices[i] > max2 )
                max2 = prices[i] + mr2;
        }
         return max2;

    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 412KB, 提交时间: 2021-09-28

class Solution {
public:
    /**
     * 计算你能获得的最大收益
     * 
     * @param prices Prices[i]即第i天的股价
     * @return 整型
     */
    int calculateMax(vector<int> prices) {
        if(prices.size()<=0)
            return 0;
        int buy1=-prices[0];
        int sell1=0;
        int buy2=-prices[0];
        int sell2=0;
        for(int i=0;i<prices.size();i++){
            buy1=max(buy1,-prices[i]);
            sell1=max(sell1,prices[i]+buy1);
            buy2=max(sell1-prices[i],buy2);
            sell2=max(sell2,prices[i]+buy2);
        }
        return sell2;
    }
};

上一题