算法训练营Day49 第九章 动态规划part10

第一题:121. 买卖股票的最佳时机 

        第一次做这道题感觉就是双指针,当fast对应的值大于slow对应的值时,就记录下来,并比较是否是最大值;当不满足该条件时,slow直接赋值为fast当前的位置,继续进行遍历即可。一次for循环就能求解出结果了。(本质上还是贪心算法

代码如下:

class Solution {
public:
    int maxProfit(vector& prices) {
        int result = 0;
        int slow = 0;
        for(int fast = 1; fast < prices.size(); fast++) {
            if(prices[fast] > prices[slow]) {
                result = max(result, prices[fast] - prices[slow]);
                continue;
            }
            slow = fast;
        }
        return result;
    }
};

当然,也可以利用动态规划的方法来解题,代码如下:

class Solution {
public:
    int maxProfit(vector& prices) {
        int n = prices.size();
        //dp[i][0]表示第i天持有股票时的最大金额
        //dp[i][i]表示第i天未持有股票时的最大金额
        vector> dp(n, vector (2));
        dp[0][0] = -prices[0];
        for(int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i-1][0], -prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]);
        }
        return dp[n-1][1];
    }
};

第一题:122. 买卖股票的最佳时机Ⅱ

        这道题同样可以想到用贪心算法来做,和上一题思路基本一致,直接给出代码。

代码如下:

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

        当然也可以考虑使用动态规划的方法来求解,思路也很简单,一看代码就知道啦。

代码如下:

class Solution {
public:
    int maxProfit(vector& prices) {
        int n = prices.size();
        //dp[i][0]表示第i天持有股票时的最大金额
        //dp[i][1]表示第i天未持有股票时的最大金额
        vector> dp(n, vector(2));
        dp[0][0] = -prices[0];
        for(int i = 1; i < n; i++) {
            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[n - 1][1];
    }
};

        Day49打卡!!!

你可能感兴趣的:(动态规划,算法)