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

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

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

import java.util.*;


public class Solution {
    /**
     *
     * @param prices int整型一维数组
     * @return int整型
     */
    public int maxProfit (int[] prices) {
        int len = prices.length;
        if (len < 2) return 0;		// 天数小于2时,直接返回0
        int[] dp = new int[len];    // 记dp[i]表示第i+1天卖出可获得的最大收益
        dp[0] = 0;	// 第1天卖出时可获得的最大收益为0(第1天还没有买入)
        dp[1] = prices[1] - prices[0];	// 第2天卖出时可获得的收益只有一种情况,即第1天买入,第二天卖出
        int max = dp[1];	// max来记录最大收益
	  	// 遍历数组,更新dp[i]
        for (int i = 2; i < len; i++) {
            int d = prices[i] - prices[i - 1];	// 第i+1天和第i天的价格差为d
		  	// 这里dp[i]的值有两种情况。假设dp[i-1]在第1到第i天中间的第m天买入股票,第i天卖出股票。
		  	// 1: 不改变买入股票的天数,依然在第m天买入股票,但是在第i+1天卖出股票。
		  	//    此时的收益为dp[i-1]+d,这样获得的收益可能比第i天卖出股票多,也可能少(因为d可能小于0)。
		  	// 2: 改变买入股票的天数(此时不选择第1~第i天中间除了第m天以外的时机买入,
		  	//    因为其他时机买入都比第m天买入获得的收益少,
		  	//    因为d[i-1]表示的是第i-1天卖出可获得的“最大收益”),
		  	//    由于不选择第i~第i天中间的时机买入,那么只能选择第i天买入股票,第i-1天卖出股票
		  	//	  此时的收益为d
		  	// 取dp[i-1]+d 和 d 这两者中的较大值作为dp[i]的值,即第i+1天卖出股票可获得的最大收益 
            dp[i] = Math.max(d + dp[i - 1], d);	
		  	// 如果第i+1天卖出股票可获得的最大收益比之前的1~i天的某一天卖出股票可获得的最大收益大,
		  	// 则更改max的值
            max = Math.max(max, dp[i]);
        }
	  	// 判断最大收益max是否大于0,如果小于0则返回0,否则返回max
        return max > 0 ? max : 0;
    }
}

全部评论

相关推荐

10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务