代码随想录刷题记录 day43 股票买卖的最佳时机1 2

代码随想录刷题记录 day43 股票买卖的最佳时机1 2

参考:代码随想录

121. 买卖股票的最佳时机

在这里插入图片描述

思想
  1. dp数组定义

    dp[i][0]表示 第i天 持有股票 手头的最大的现金数为dp[i][0]

    dp[i][1]表示 第i天 不持有股票 手头的最大的现金数为dp[i][1]

  2. 递推公式

    dp[i][0]= dp[i-1][0] :第i-1天持有 , -prices[i] :第i-1天不持有,第i天持有了 表示买入了股票。因为本题股票只能买卖一次,所以是-prices[i]

    dp[i][1]=Math.max(dp[i-1][0]+prices[i] :i-1天持有,i天不持有 表示卖出,dp[i-1][1]:i-1天不持有,i天也不持有)

  1. 初始化

    dp[0][0]=-prices[0];

    dp[0][1]=0;

  2. 遍历顺序,依靠之前的状态

  3. 打印数组

在这里插入图片描述

代码
class Solution {
    public int maxProfit(int[] prices) {
        //dp[i][0]表示 第i天 持有股票 手头的最大的现金数为dp[i][0]
        //dp[i][1]表示 第i天 不持有股票 手头的最大的现金数为dp[i][1]
        //dp[i][0]= dp[i-1][0] 第i-1天持有   -prices[i] 第i-1天不持有,第i天持有了 表示买入了股票
        //dp[i][0]=Math.max(dp[i-1][0],-prices[i])

        //dp[i][1]=Math.max(dp[i-1][0]+prices[i] ,dp[i-1][1])

        //初始化
        int[][] dp=new int[prices.length][2];
        dp[0][0]=-prices[0];
        dp[0][1]=0;

        for(int i=1;i<prices.length;i++){
            dp[i][0]=Math.max(dp[i-1][0],-prices[i]);
            dp[i][1]=Math.max(dp[i-1][0]+prices[i], dp[i-1][1]);
        }

        return dp[prices.length-1][1];
    }
}

122. 买卖股票的最佳时机 II

在这里插入图片描述

思想

1.贪心

2.动态规划

和上一题的区别就是可以多次买卖,所以dp[i][0]=max(dp[i-1][0], dp[i-1][1]-prices[i])

代码
class Solution {
    // public int maxProfit(int[] prices) {
    //     //只要第二天的利润为正的 就卖出股票
    //     int res=0;
    //     for(int i=1;i<prices.length;i++){
    //         if(prices[i]>prices[i-1]){
    //             res+=prices[i]-prices[i-1];
    //         }
    //     }
    //     return res;
    // }

    public int maxProfit(int[] prices){
        //dp[i][0]表示第i天 持有股票 手上的最大的现金
        //dp[i][1]表示第i天 不持有股票 手上的最大的现金

        //dp[i][0]:
        //i-1天持有,i天还持有 dp[i][0]=dp[i-1][0]
        //i-1天不持有 i天持有 说明在第i天买入了 dp[i][0]=dp[i-1][1]-prices[i]  和上一题不同的是可能这里有利润,会有剩余
        //dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i])

        //dp[i][1]
        //i-1天持有,第i天不持有,表示卖出股票 dp[i][1]=dp[i-1][0]+prices[i]
        //i-1天不持有 第i天也不持有 dp[i][1]=dp[i-1][1]

        int[][] dp=new int[prices.length][2];
        dp[0][0]=-prices[0];
        dp[0][1]=0;

        for(int i=1;i<prices.length;i++){
            dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);
            dp[i][1]=Math.max(dp[i-1][0]+prices[i], dp[i-1][1]);
        }

        return dp[prices.length-1][1];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值