leetcode122-买卖股票的最佳时机II

leetcode 122

思路

方法一的核心思想是简单的贪心策略。我们每天都看当前价格和下一个价格的差值。如果下一个价格高于当前价格(即diff > 0),那么就认为当天可以买入并在第二天卖出,赚取利润。因此,方法一把所有的价格差(即diff > 0的部分)累加起来,最终得出最大利润

步骤:

遍历整个数组,计算相邻两个价格的差值

如果差值为正(表示价格上涨),则加入利润

powershell 复制代码
时间复杂度:O(n),其中 n 是 prices 数组的长度,因为只需要遍历一遍数组
空间复杂度:O(1),只使用了常量空间

方法二模拟买入和卖出的策略 重点是通过标记是否已经持有股票来区分买入和卖出时机

通过比较当前和前一个价格差(curdiff 和 prediff)来决定买入和卖出。

flag 标志用来表示当前是否持有股票。如果持有股票且价格下跌,则卖出;如果没有股票且价格上涨,则买入。

在循环结束后,检查是否还有未卖出的股票,如果有则在最后时刻卖出

方法二和之前的摆动序列很相似,也可以参考此博文

实现

方法1-贪心算法
js 复制代码
var maxProfit = function (prices) {
    let sum = 0;
    for (let i = 0; i < prices.length - 1; i++) {
        let diff = prices[i + 1] - prices[i]
        if (diff > 0) {
            // 可以买入
            sum += diff
        }
    }
    return sum;
};
方法2
js 复制代码
var maxProfit = function (prices) {
  let prediff = 0, curdiff = 0;
  let sum = 0, flag = false;
  for (let i = 0; i < prices.length - 1; i++) {
    curdiff = prices[i + 1] - prices[i];
    if (curdiff > 0 && prediff <= 0) {
      // 可以买入
      sum -= prices[i]
      flag = true
      prediff = curdiff
    }
    if (flag && curdiff < 0 && prediff >= 0) {
      // 可以卖出
      sum += prices[i]
      flag = false;
      prediff = curdiff
    }
  }
  // 到最后都还没有卖出,把最后一个卖掉
  if (flag) {
    sum += prices[prices.length - 1]
  }
  return sum;
};
相关推荐
vvilkim1 小时前
深入理解 TypeScript 中的 implements 和 extends:区别与应用场景
前端·javascript·typescript
GISer_Jing1 小时前
前端算法实战:大小堆原理与应用详解(React中优先队列实现|求前K个最大数/高频元素)
前端·算法·react.js
小森77672 小时前
(三)机器学习---线性回归及其Python实现
人工智能·python·算法·机器学习·回归·线性回归
振鹏Dong3 小时前
超大规模数据场景(思路)——面试高频算法题目
算法·面试
uhakadotcom3 小时前
Python 与 ClickHouse Connect 集成:基础知识和实践
算法·面试·github
uhakadotcom3 小时前
Python 量化计算入门:基础库和实用案例
后端·算法·面试
uhakadotcom3 小时前
使用 Python 与 BigQuery 进行交互:基础知识与实践
算法·面试
uhakadotcom3 小时前
使用 Hadoop MapReduce 和 Bigtable 进行单词统计
算法·面试·github
XYY3694 小时前
前缀和 一维差分和二维差分 差分&差分矩阵
数据结构·c++·算法·前缀和·差分
longlong int4 小时前
【每日算法】Day 16-1:跳表(Skip List)——Redis有序集合的核心实现原理(C++手写实现)
数据库·c++·redis·算法·缓存