[javascript]买卖股票的最好时机

买卖股票的最好时机

描述

假设你有一个数组,其中第 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
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值