121-买卖股票的zui佳时机

【C++】每日一题 121 买卖股票的最佳时机 该算法的核心思想是维护两个变量:当前最小价格(minPrice)和当前最大利润(maxProfit)。在遍历数组时,更新最小价格和计算当前价格与最小价格的差值,得到当前最大利润。最终返回最大利润即可。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。遍历数组一次,时间复杂度为 O(n),其中 n 为数组的长度。仅使用了常量级别的额外空间,空间复杂度为 O(1)。 阅读详情

题目

给定一个数组 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。

题解

const maxProfit = prices => {
    const len = prices.length;
    // 创建dp数组
    const dp = new Array(len).fill([0, 0]);
    // dp数组初始化
    dp[0] = [-prices[0], 0];//0是持有,1是不持有
    for (let i = 1; i < len; i++) {
        // 更新dp[i]
        dp[i] = [
            Math.max(dp[i - 1][0], -prices[i]),//-price[i]是因为只买一次
            Math.max(dp[i - 1][1], prices[i] + dp[i - 1][0]),
        ];
    }
    return dp[len - 1][1];
};

思路:

  1. 动态规划:

    状态定义:

    dp[i][j]:下标为 i 这一天结束的时候,手上持股状态为 j 时,我们持有的现金数。换种说法:dp[i][j] 表示天数 [0, i] 区间里,下标 i 这一天状态为 j 的时候能够获得的最大利润。其中:

    • j = 0,表示当前不持股;
    • j = 1,表示当前持股。

    推导状态转移方程:

    dp[i][0]:规定了今天不持股,有以下两种情况:

    • 昨天不持股,今天什么都不做;

    • 昨天持股,今天卖出股票(现金数增加);

    dp[i][1]:规定了今天持股,有以下两种情况:

    • 昨天持股,今天什么都不做(现金数与昨天一样);
    • 昨天不持股,今天买入股票(注意:只允许交易一次,因此手上的现金数就是当天的股价的相反数)。
  2. array.fill

  3. const dp = new Array(len).fill([0, 0]);

【LeetCode题目详解】第八章 贪心算法 part02 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II (day32补) 股票问题其实是一个系列的,属于动态规划的范畴,因为目前在讲解贪心系列,所以股票问题会在之后的动态规划系列中详细讲解。可以看出有时候,贪心往往比动态规划更巧妙,更好用,所以别小看了贪心算法。本题中理解利润拆分是关键点!不要整块的去看,而是把整体利润拆为每天的利润。一旦想到这里了,很自然就会想到贪心了,即:只收集每天的正利润,最后稳稳的就是最大利润了。这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。大家可以看出思路想出来了,代码还是非常简单的。 阅读详情

相关推荐

【经典算法】LeetCode 121. 买卖股票的最佳时机(Java/C/Python3实现含注释说明,Easy)

对比项一次遍历(贪心算法)动态规划解题思路每次选择当前状态下的最优解,不考虑未来的变化构建状态转移方程,逐步求解,保存中间结果适用场景局部最优选择能直接导致全局最优,如连续上涨的市场涉及多次买入卖出、考虑冷冻期、手续费等复杂情况空间复杂度O(1),较低,只需保存当前状态信息O(n),较高,需保存多个状态的最优解时间复杂度O(n), 较低,通常一次遍历即可O(n),较高,需遍历所有可能状态全局最优性保证不一定能保证全局最优解可以得到全局最优解灵活性较低,适用于简单直接的交易策略。

2401_84427485的博客 1881

LeetCode 121. 买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 示例 1: 输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1

tomjobs的博客 1764

力扣题解系列:121. 买卖股票的最佳时机

题目:121. 买卖股票的最佳时机 题目描述: 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? 示例: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。 提示: 1.0 <= 数组长度 <= 10^5 来源:力扣(LeetCode) 链接:h

qq_38813052的博客 367

LeetCode:121.买卖股票的最佳时机——动态规划

121. 买卖股票的最佳时机(1、2)——动态规划、贪心策略 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择**某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票**。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 🍎道阻且长,行则将至。🍓!!!

Super algorithm 的博客,技术爱好者。 3266

STM32 ADC+DMA实战:手把手教你驱动XGZP6847A压力传感器(附完整代码)

本文详细介绍了如何使用STM32的ADC和DMA外设驱动XGZP6847A压力传感器,包括硬件连接、ADC配置、DMA高效传输实现以及数据处理与校准方法。通过实战案例和完整代码,帮助开发者快速掌握高精度压力数据采集技术,适用于工业控制和医疗设备等领域。

weixin_42570484的博客 405

广义平均(Generalized Mean, GeM)

本位介绍了广义平均操作的定义和简要推导,帮助大家理解其含义。

qq_45802280的博客 4548

121. 买卖股票的zui佳时机 Ⅰ

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 class Solution { public int maxProfit(int[] prices) { int maxPro = 0, min = prices[0];

m0_56219511的博客 333

基于STM32的频率计(采用外部中断的方式)

前言 最近在了解电赛相关的东西,和指导老师交流一下,我决定先从最简单的频率计做起。 频率计是来检测信号的频率的,在做频率计的时候可以用信号发生器发出的信号来进行测试。 原理 这是最基础的方波,我们可以通过检测上升沿的方式来测量其频率。从周期的角度出发连续两个上升沿的时间就是这个方波的周期,那这个周期分之一就是这个方波的频率了。 在思考了一段时间~~(我是萌新。。)~~ 我觉得有两个方法可以实现,第一个是采用stm32定时器的输入捕获功能,第二个就是用外部中断来实现这个功能。正如标题,我这次采用外部中断的方

qq_45784922的博客 6171

【LeetCode - Java】121. 买卖股票的zui佳时机 (简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 暴力穷举(卒 | 时间超限)3.2 动态规划 1. 题目描述 2. 解题思路 题目初看很简单,以为用暴力穷举可以解决问题,其时间复杂度为O(n²),后来想想用暴力肯定时间超限,一提交果然如此,那就另寻他路。 思考一下,假如我要今天卖出这个股票,那我什么时候买入才是赚钱最多的呢? 毫无疑问,当我在今天之前的最低点买入,那我在今天卖出就可以赚最多的钱。 既然这个问题思考清楚了,算法应该就没问题了,只需要遍历一次数组,在每一天时候对比今天之前(第0到i天)的

Beemo的博客 544

超详细Tokenizer——文本训练数据预处理

Tokenizer是Keras库中的一个文本处理工具,它用于将文本分词并构建词汇表,同时将文本映射到整数序列。这对于自然语言处理任务非常有用,例如文本分类、情感分析、机器翻译等。

halo的博客 3703

电容式麦克风:从原理到实际电路波形解析

本文深入解析电容式麦克风的工作原理,从核心的振膜与背板结构、电荷锁定机制到场效应管放大器的作用。通过实物拆解与等效电路分析,阐明声音振动如何转换为电压信号,并指导如何用示波器实测波形,直观展现声电转换过程,适合电子爱好者和音频技术学习者。

Black的专栏 1088

121. 买卖股票的zui佳时机(JavaScript)

121. 买卖股票的zui佳时机(JavaScript)

csD_Dscnnnnnnn的博客 226

大数据与宠物:健康监测数据分析

随着全球宠物市场规模的快速增长(2023年全球宠物产业规模已达3500亿美元),宠物健康管理需求呈现指数级上升。传统宠物医疗依赖定期体检和症状观察,存在滞后性和主观性缺陷。本文聚焦如何通过物联网(IoT)设备采集宠物生理数据(体温、心率、活动量等),利用大数据分析技术构建实时健康监测系统,实现宠物健康状态的动态评估、异常预警和疾病预测。研究范围涵盖数据采集技术、数据预处理方法、机器学习模型构建及实际应用场景落地。背景介绍:明确研究目的、目标读者及核心术语核心概念与联系。

2502_91592937的博客 1068

一刷122-贪心-121买卖股票的zui佳时机(e)(剑指 Offer 63. 股票的最大利润)

题目: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。 设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 ------------------------ 示例: 输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出

唐宋元明清的博客 79

Vue3 - vite 项目报错:Uncaught ReferenceError: require is not defined(解决 vue3 vite 项目无法识别 require 语法导致报错)

vue3,vite,报错解决,vue3+vite报错requireisnotdefined,vue3vite引插件不识别require,老插件必须用require怎么办,vite项目插件要求使用require引入但报错,vue3不兼容require导致第三方包插件无法使用,vue3vite中使用require报错怎么办,解决Vite+vue3使用第三方依赖报错“requireisnotdefined”问题,vite项目require语法兼容问题解决requireisnotdefine

🏆 前端领域优质创作者 2万+

【机器学习】一文搞懂算法模型之:Transformer

必会算法模型之:Transformer

商务合作 | 面试培训 | 职场规划 ==>主页扫码 5610

【每日力扣35】买卖股票的zui佳时机

一、题目[LeetCode-121] 给定一个数组 prices,它的第i个元素prices[i]表示一支给定股票第 i天的价格。 你只能选择 某一天买入这只股票,并选择在 未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0。 示例 1: 输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大...

micah_yaokunkun的博客 198

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Leetcode】121.买卖股票的最佳时机

因此,我们只需要遍历价格数组一遍,记录历史最低点,然后在每一天考虑这么一个问题:如果我是在历史最低点买进的,那么我今天卖出能赚多少钱?我们来假设自己来购买股票。随着时间的推移,每天我们都可以选择出售股票与否。那么,假设在第 i 天,如果我们要在今天卖股票,那么我们能赚多少钱呢?显然,如果我们真的在买卖股票,我们肯定会想:如果我是在历史最低点买的股票就好了!太好了,在题目中,我们只要用一个变量记录一个历史最低价格。,我们就可以假设自己的股票是在那天买的。那么我们在第 i 天卖出股票能得到的利润就是。

码农努力学习 449

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【LeetCode】121.买卖股票的最佳时机

给定一个数组,它的第个元素表示一支给定股票第天的价格。你只能选择买入这只股票,并选择在卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。

qq_44721910的博客 709

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【LeetCode】121. 买卖股票的最佳时机

121. 买卖股票的最佳时机

比尔高特的博客 652

leetcode 121. 买卖股票的最佳时机

从后向前的,然后求出每个element后的最大值,然后求差的,差的最大值就是结果

邹九的个人博客 450

【力扣算法】121-买卖股票的最佳时机

题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 ...

ZeromaXHe的博客 929

LeetCode 买卖股票的最佳时机

使用数学方法,将求差转换为求区间和,解决《买卖股票的最佳时机》问题

"大梦三千秋的博客 509

121. 买卖股票的最佳时机

买卖股票的最佳时机暴力枚举法动态规划 暴力枚举法 满足两个条件: 1.卖出在买入后; 2.差值最大; class Solution { public: int maxProfit(vector<int>& prices) { int n = (int)prices.size(), ans = 0; for (int i = 0; i < n; ++i){ for (int j = i + 1; j < n; ++

weixin_42822452的博客 136

《LeetCode刷题》—121. 买卖股票的最佳时机

《LeetCode刷题》—121. 买卖股票的最佳时机

小贺想改变 493
上一篇: 114-二叉树展开为链表
下一篇: 128-最长连续序列
codrab
博客等级 码龄10年 15粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codrab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值