【Java】购买股票的最佳时间

购买股票的最佳时间–力扣连接

放置两个哨兵,分别记录购买的最小值和利润的最大值

使用单个for循环进行遍历,每次遍历的时候比较当前时间是不是最低价格,是最低就记录下来最低价格,比较当前时间卖出股票是否是最大利润,是最大利润就记录下来,最后返回l利润最大值。

class Solution {
    public int maxProfit(int[] prices) {
        int max=0;
        int min=Integer.MAX_VALUE;
        for (int i=0;i<prices.length;i++){
            if(prices[i]<min){
                min=prices[i];
            }
            if(prices[i]-min>max){
                max=prices[i]-min;
            }
        }
        return max;
    }
}

使用动态规划

建立二维dp[prices.length][2]数组用来表示购买花费的最小值和利润的最大值。

其中dp[i][0]表示的是第i天不持有股票时自己利润的最大值,其中包括情况:没有买过股票,dp[i][0]的值为零。已经卖出了股票,当前的值为买进股票的花费加上卖出股票的收入,所以递推公式为:dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i])

其中dp[i][1]表示的是第i天持有股票时自己的资产,为负数,选择自己购买花费值最小,所以递推公式为:dp[i][1]=max(dp[i-1][1],-prices[i])

class Solution {
    public int maxProfit(int[] prices) {
        if (prices.length<2 ) return 0;
        int [][]dp=new int [prices.length][2];
        
        /**
         *  dp[i][0]:表示今天不持股(没有购买或者已经卖出,没有购买,dp的值是0,卖出之后,dp的值就是收益)
         *  dp[i][1]:表示今天持股(今天或者今天之前购买了股票,值为负数,表示购买股票的花费)
         * */
        //初始化第一天的情况,第一天不持有股票,也就是没有购买,利润为0,第一天持有股票,也就是第一天购买股票,价格就是第一天值
        dp[0][0]=0;
        dp[0][1]=-prices[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][1],-prices[i]);
        }
        
        return dp[prices.length-1][0];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值