当前位置: 首页 > news >正文

【LeetCode】122. 买卖股票的最佳时机 II(中等)——代码随想录算法训练营Day32

题目链接:122. 买卖股票的最佳时机 II

题目描述

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

示例 1:

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

示例 2:

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

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。

提示:

  • 1 <= prices.length <= 3 * 104
  • 0 <= prices[i] <= 104

文章讲解:代码随想录

视频讲解:贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机II_哔哩哔哩_bilibili

题解1:暴力法

思路:将价格数组看成一个函数图像,寻找极大值点和极小值点,极小值点就是买入的点,极大值点就是卖出的点,结合起来就是总利润,最左和最右的值要特殊处理。

/*** @param {number[]} prices* @return {number}*/
var maxProfit = function(prices) {let res = 0;let pre = 0;let min = prices[0];for (let i = 0; i < prices.length - 1; i++) {let cur = prices[i + 1] - prices[i];// 判断极大值if (pre >= 0 && cur < 0) {res += prices[i] - min; // 将利润累加min = prices[i + 1];pre = cur;}// 判断极小值if (pre <= 0 && cur > 0) {if (prices[i] < min) {min = prices[i];}pre = cur;}}// 最右边的元素特殊处理if (prices.length > 1 && pre >= 0 && prices[prices.length - 1] >= prices[prices.length - 2]) {res += prices[prices.length - 1] - min;}return res;
};

分析:时间复杂度为 O(n),空间复杂度为 O(1)。

题解2:贪心算法

思路:可以模拟每天卖出之前的股票并买入新的股票,每个阶段都取正数的利润,最后得到的总利润就是最大的。

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

分析:时间复杂度为 O(n),空间复杂度为 O(1)。

收获

贪心算法没有固定的方法,对于每道题目的思路都不一样。如果模拟出可以使用贪心算法将局部最优合成全局最优。

相关文章:

  • react渲染流程是怎样的
  • reprod_log复现精度对比小工具
  • sql语句学习(二)--增删改
  • 算法训练营day24(补),回溯4-2
  • Python爬虫 Beautiful Soup库详解#4
  • 5 scala的函数式编程简介
  • LeetCode.145. 二叉树的后序遍历
  • Linux篇:网络基础1
  • SPI控制8_8点阵屏
  • 2024/2/13
  • 【RT-DETR进阶实战】利用RT-DETR进行视频划定区域目标统计计数
  • day 31贪心
  • 动态规划10-完全背包理论(一维数组/二维数组/Java)
  • steam游戏搬砖项目靠谱吗?有没有风险?
  • Prometheus服务器、Prometheus被监控端、Grafana、监控MySQL数据库、自动发现概述、配置自动发现、Alertmanager
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android单元测试 - 几个重要问题
  • co模块的前端实现
  • HashMap ConcurrentHashMap
  • Lsb图片隐写
  • nginx 配置多 域名 + 多 https
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Service Worker
  • Spark学习笔记之相关记录
  • Vue 2.3、2.4 知识点小结
  • Zepto.js源码学习之二
  • 从0到1:PostCSS 插件开发最佳实践
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 计算机常识 - 收藏集 - 掘金
  • 前端学习笔记之观察者模式
  • 让你的分享飞起来——极光推出社会化分享组件
  • 入门级的git使用指北
  • 深度解析利用ES6进行Promise封装总结
  • 小程序测试方案初探
  • 云大使推广中的常见热门问题
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • hi-nginx-1.3.4编译安装
  • ​用户画像从0到100的构建思路
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • (1)(1.13) SiK无线电高级配置(六)
  • (13)Hive调优——动态分区导致的小文件问题
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (定时器/计数器)中断系统(详解与使用)
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (学习日记)2024.01.09
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .Net CF下精确的计时器
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 发送邮件
  • .NET 中创建支持集合初始化器的类型
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈