SOURCE

// 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

// 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

// 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

// 示例 1:
// 输入:[7,1,5,3,6,4]
// 输出:5
// 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

// 示例 2:
// 输入:prices = [7,6,4,3,1]
// 输出:0
// 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

// 双重循环算出最大值
// 1、含义
// dp[i][0] 持有
// dp[i][1] 不持有

// 2、公式
// 持有两种:当天、前一天(前几天)
// i-1就持有 dp[i-1][0]
// i持有 -prices[i]
// 选最大的,因为是负数
// Math.max(dp[i-1][0],-prices[i]);

// 不持有两种:当天、前一天
// 前一天不在持有是 dp[i-1][1]
// 当天是 dp[i-1][0]+prices[i] 负数+正数
// Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);

// 3、初始化
// 持有 dp[0][0] = -prices[0]
// 不持有 dp[0][1] = 1

// 4、从前向后


function Solution (nums) {
  var dp = [[-nums[0], 0]];
  var c = dp[0][1];
  for (let i = 1; i < nums.length; i++) {
    dp[i][0] = Math.max(dp[i - 1][0], -nums[i]);
    dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + nums[i]);
    if (dp[i][1] > max) {
      max = dp[i][1];
    }
  }
  return max;
}
var nums = [7, 1, 5, 3, 6, 4];
// 5
console.log(Solution(nums));
console 命令行工具 X clear

                    
>
console