题目
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
思路
此题根据标签查找,一开始就知道用动态规划,所以思路很明确。动归嘛,首先想到的就是要找 递推 关系啊。根据题意求解最大的利润,股票的价格是不断变化,不到最后一天肯定不知道最大的利润是多少,因此可以理解为求解第n(n为数组的长度)天的最大利润,那就看第n-1天与第n天的利润有何关系。
决定利润的因素有两个 买入价格 与 卖出价格
设dp[n]
表示第n天的最大利润,p[n]
为 第n
天买入时的价格 p[j]
为 第j
天买入时的价格。
到了第n天,有两种选择,要么卖出,此时利润为 p[n]-p[j]
;要么不卖,此时利润为dp[n-1]
所以可得: dp[n] =max(max(p[n]-p[j],dp[n-1]) 1<=j<n)
因为哪天买入时不确定,所以需要遍历一遍,取最大值。
代码实现
class Solution {
public int maxProfit(int[] prices) {
if(prices.length<2) return 0;
// 为方便编程 天数也从零开始计数,与数组索引统一。
// 共有 prices.length-1 天。
int[] dp = new int[prices.length];
for(int i=1;i<prices.length;i++){
// 第i天时的利润
int iProfit = 0;
// j 代表在哪一天买入
for(int j=0;j<i;j++){
// 卖出的利润,与不卖的利润相比较 取最大的
// 第j天买入,到第 i 天时的最大利润
int jProfit = Math.max(prices[i] - prices[j],dp[i-1]);
// 遍历,取这些天最大的利润
iProfit = Math.max(iProfit,jProfit);
}
dp[i] = iProfit;
}
return dp[prices.length-1];
}
}