描述
假设你有一个数组,其中第 i 个元素是股票在第i天的价格。
你可以买入一次股票和卖出一次股票(并非每天都可以买入或卖出一次,总共只能买入和卖出一次),问能获得的最大收益是多少。
示例1
输入:
[1,4,2]
返回值:
3
示例2
输入:
[2,4,1]
返回值:
2
代码与分析
我们来定义一个二维数组dp[][]
,其中dp[i][0]
表示第i+1天(i是从0开始的)结束的时候没持有股票的最大利润,dp[i][1]
表示第i+1天结束的时候持有股票的最大利润。
第一种情况就是第i+1天我们即没买也没卖,那么最大利润就是第i天没持有股票的最大利润dp[i-1][0]
第二种情况就是第i+1天我们卖了一支股票,那么最大利润就是第i天持有股票的最大利润(这个是负的,并且也不一定是第i天开始持有的,有可能在第i天之前就已经持有了)加上第i+1天卖出股票的最大利润,dp[i-1][1]+prices[i]
状态转移方程
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]);
dp[i][1]=max(dp[i-1][1],-prices[i]);
/**
*
* @param prices int整型一维数组
* @return int整型
*/
function maxProfit( prices ) {
// write code here
if(prices== null) return 0
let len=prices.length
let dp=[]
for(let i=0;i<len;i++){
dp[i]=[]
}
dp[0][0]=0
dp[0][1]=-prices[0]
for(let i=1;i<len;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[len-1][0]
}
module.exports = {
maxProfit : maxProfit
};