题解 | #买卖股票的最好时机#
买卖股票的最好时机
http://www.nowcoder.com/practice/64b4262d4e6d4f6181cd45446a5821ec
动态规划
什么时候能够得到最大利润?最低价格买入,最高价格卖出,且买入时间早于卖出时间。
i从0开始计数,dp[i]代表在第i天卖出时,能够获取的最大利润。同时需要一个变量mi,作为前面i-1天内,最低价格,这个可以放在循环内更新。
所以,dp[0]=0, 因为第0天只能当天买入,当天卖出。
dp[i]就有以下两种情况:
如果第i天的价格比mi还低,那么第i天卖出一定是亏的,dp[i]是个负数,由于题目要求最大值,我们可以将亏损的钱不计算,直接赋值为0.
如果第i天的价格比mi高,那么第i天卖出,最大利润一定是(第i天的价格-mi)
注意,在循环时候需要设置一个ans,每次算出dp[i]时, ans = Math.max(ans,dp[i]),这样ans就是返回值。
public int maxProfit (int[] prices) {
// write code here
if(prices.length<=1){
return 0;
}
int mi = prices[0];
int [] dp = new int[prices.length];
dp[0] = 0;
int ans =0 ;
// dp[i]表示第i天卖出最大利润
for(int i=1; i < prices.length ; i++){
if(prices[i]<mi){
dp[i]=0;
mi = prices[i];
}else{
dp[i] = prices[i]-mi;
}
ans = Math.max(ans,dp[i]);
}
return ans;
}