Skip to content

[leetcode]122.买卖股票的最佳时II #43

@MagicalBridge

Description

@MagicalBridge

给定一个数组,它的第i个元素是一支给定股票第天的价值。

设计一个算法来计算你所能够获取的最大利润,你可以尽可能多的完成交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易 (你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

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

这道题目和lc121很类似,但是都属于比较简单的,这道题目由于可以无限次的买入和卖出,我们都知道炒股想要挣钱的话当然是低价买入,高价卖出,那么这里我们只需要从第二天开始,如果当天价格比之前的价格高,则把差价加入利润中,因为我们可以昨天买入,今日卖出,若明天价格更高的话,还可以今日买入,明天再抛出,以此类推遍历完整个数组,即可求出最大利润。

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function (prices) {
  let res = 0;
  for (let i = 0; i < prices.length - 1; i++) {
    if(prices[i] < prices[i+1]) {
      res += prices[i+1] - prices[i];
    }
  }
  return res;
};

复杂度分析:

  • 时间复杂度 O(N), 整个算法只遍历了一遍数组。
  • 空间复杂度 O(1), 只使用了常数级别的额外空间。

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions