题解 | #买卖股票的最好时机(一)#

买卖股票的最好时机(一)

https://www.nowcoder.com/practice/64b4262d4e6d4f6181cd45446a5821ec

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param prices int整型vector 
     * @return int整型
     */
    int maxProfit(vector<int>& prices) {
        // write code here
        if(prices.size()<2){
            
            return 0;
        }
        if(prices.size()==2&&prices[1]-prices[0]<0){
                 
            return 0;
        }
        vector<int> dp(prices.size()+1);
        dp[0]=0;
        dp[1]=prices[1]-prices[0];
        int min_price=prices[0];
        for(int i=1;i<prices.size();i++){
            dp[i+1]=max(dp[i],prices[i]-min_price);
            min_price=min(min_price,prices[i]);
        }
        return dp[prices.size()];

        
    }
};

动态规划:假设第t天时,最大利润是m,第t+1天呢?我们需要考虑这多出来的一天是否需要操作,如果不需要操作那么最大利润还是m,如果需要操作,那么必然是t+1天卖出,那么怎么样使得利润最大,就是在1-t天内找一个最低min_price的买入。所以构建dp(prices.size+1); 第一天不能完成买卖各一次。第二天可以买卖一次,就是第一天买,第二天卖。就是第二天的价格-第一天的min_price所以min_price初始按第一天的算 int min_price=prices[0]; 那么第三天就是判断仍然保持第二天的操作还是第三天卖出 dp[i+1]=max(dp[i],prices[i]-min_price); ,在第1-2天选最小的买入。所以需要同步维持一个最小值min_prices. min_price=min(min_price,prices[i]); 按这个逻辑进行下去就可以找到整个t天的最大利润。此外有可能只有一天吗,那就是利润为0,当只有两天时,并且操作可以完成是亏本的,按题目所给条件,也是返回0;

全部评论

相关推荐

11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务