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

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

http://www.nowcoder.com/practice/4892d3ff304a4880b7a89ba01f48daf9

思路在代码中有详细的解释:状态的构建是最重的一步,(部分引用自:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/solution/tong-su-yi-dong-de-dong-tai-gui-hua-jie-fa-by-marc/)

代码:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 两次交易所能获得的最大收益
     * @param prices int整型一维数组 股票每一天的价格
     * @return int整型
     */
    public int maxProfit (int[] prices) {
        // write code here
        if(prices==null||prices.length==0){
            return 0;
        }
        int n=prices.length;
        //具体一天结束时的6种状态:
    // 未持股,未卖出过股票:说明从未进行过买卖,利润为0
    // dp[i][0][0]=0
    // 未持股,卖出过1次股票:可能是今天卖出,也可能是之前卖的(昨天也未持股且卖出过)
    // dp[i][0][1]=max(dp[i-1][1][0]+prices[i],dp[i-1][0][1])
    // 未持股,卖出过2次股票:可能是今天卖出,也可能是之前卖的(昨天也未持股且卖出过)
    // dp[i][0][2]=max(dp[i-1][1][1]+prices[i],dp[i-1][0][2])
    // 持股,未卖出过股票:可能是今天买的,也可能是之前买的(昨天也持股)
    // dp[i][1][0]=max(dp[i-1][0][0]-prices[i],dp[i-1][1][0])
    // 持股,卖出过1次股票:可能是今天买的,也可能是之前买的(昨天也持股)
    // dp[i][1][1]=max(dp[i-1][0][1]-prices[i],dp[i-1][1][1])
    // 持股,卖出过2次股票:最多交易2次,这种情况不存在,不需要处理
    // dp[i][1][2]=float('-inf')
//     后续还可以进行空间优化,但要注意是倒序进行
        int[][][] dp=new int[n+1][2][3];
        dp[0][1][0]=Integer.MIN_VALUE;
        dp[0][1][1]=Integer.MIN_VALUE;
        for(int i=1;i<=n;i++){
            dp[i][1][0]=Math.max(dp[i-1][1][0],dp[i-1][0][0]-prices[i-1]);
            dp[i][0][1]=Math.max(dp[i-1][0][1],dp[i-1][1][0]+prices[i-1]);
            dp[i][1][1]=Math.max(dp[i-1][1][1],dp[i-1][0][1]-prices[i-1]);
            dp[i][0][2]=Math.max(dp[i-1][0][2],dp[i-1][1][1]+prices[i-1]);
        }
        
        return dp[n][0][2];
        
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务