力扣-122-买股票最佳时机

1、看不出来,脑筋急转弯?只要下一天高就卖出当天还可以买入迭代就好了。。

2、

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int sum=0;
        for(int i=0;i<prices.size()-1;i++)
        {
            int j=i+1;
                if(prices[i]<prices[j])
                {
                    sum+=prices[j]-prices[i];
                    //i++;
                }            
        }
        return sum;
    }
};

3、还是别人写的动态规划看着很舒服

.动态规划

第iii天仅有两种状态:持有或不持有.
假设数组dp[i][0]表示第i天不持有股票时的利益:dp[0][0] = 0
dp[i][1]表示第i天持有股票时的利益:dp[0][1] = -prices[0]
相关的状态分析如下:

    持有状态:
    1.今天买入:则昨天是不持有的状态,当天利益为dp[i-1][0]-prices[i];
    2.前一天也持有:今天没有卖出,当天利益为dp[i-1][1];
    取其大着作为当天持有状态下的利益。
    非持有状态:
    1.今天卖出:则昨天是持有的状态,当天利益为dp[i-1][1]+prices[i];
    2.前一天也不持有:则今天也没有买入,当天利益就是前一天利益,即dp[i-1][0];
    取其大者作为当天非持有状态下的利益。

最后一天不持有股票时的利益即为最大利润.

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        // 动态规划解法
        
        // 0.初始判断
        if(prices.empty()) return 0;
        
        int dp[prices.size()][2];
        // 1.初始状态
        dp[0][0] = 0;//不持有
        dp[0][1] = -prices[0];

        // 2.状态转移
        for(int i = 1; i<prices.size();i++){
            // 3.状态转移方程
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]);
        }
        return dp[prices.size()-1][0];
    }
};


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章