Best Time to Buy and Sell Stock(股票的价值系列 整理总结)

leetcode难题之Best time to buy and sell stock大合集 这次带来的是Best time to buy and sell stock大合集,在leetcode上这一合集共有6道题,难度从easy到hard不等,我们这次记录下这一合集的全部解法并记录下解题的思考想法。所有的题目都是计算不同计算规则下股票的最大利润。 一,Best Time to Buy and Sell Stock (一次交易) Say you have an array for w... 阅读详情
  • 股票的最大价值I (leetcode 121)
    • 题目:假设把某股票的价格按照时间先后顺序存储再数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。如果5买入,16迈出,则利润为11.
    • 思路:
      • 定义一个函数diff(i) 表示为卖出价格为数组下标为i的元素时获得的最大利润。显然只要找到前i-1个数中最小的元素,就能算出当前的最大利润。
    • 代码:
      class Solution {
          public int maxProfit(int[] prices) {
              if(prices==null||prices.length<2){
                  return 0;
              }
              int min = prices[0];
              int curMaxPro = 0;
              for(int i=1;i<prices.length;i++){
                  if(curMaxPro<prices[i]-min){
                      curMaxPro = prices[i]-min;
                  }
                  if(prices[i]<min){
                      min = prices[i];
                  }
              }
              return curMaxPro;
          }
      }​
  • 股票的最大值II (leetcode 122)
    • 题目:假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。
    • 思路:
      • 本题由于是可以操作任意次数,只为获得最大收益,而且对于一个上升子序列,比如:[5, 1, 2, 3, 4]中的1, 2, 3, 4序列来说,对于两种操作方案:1 在1买入,4卖出 2 在1买入,2卖出同时买入,3卖出同时买入,4卖出 这两种操作下,收益是一样的。所以可以从头到尾扫描prices,如果price[i] – price[i-1]大于零则计入最后的收益中。即贪心法
      • https://www.jianshu.com/p/34bbb0594bd9
    • 代码:
      class Solution {
          public int maxProfit(int[] prices) {
              if(prices==null||prices.length<2){
                  return 0;
              }
              int curMaxProf = 0;
              for(int i=0;i<prices.length-1;i++){
                  if(prices[i+1]>prices[i]){
                      curMaxProf += prices[i+1]-prices[i];
                  }
              }
              return curMaxProf;
          }
      }
  • 股票的最大值III(leetcode 123)
    • 题目:有一个数组arr,其中第i 个元素是第i天给定股票的价格。设计算法以找到最大利润。最多可以完成两笔交易。
    • 思路:
      • 还是动态规划的思想。因为最多时两笔交易。也就是说有两种情况可能达到最大利润。一种是完成一笔交易达到最大利润,还有一种是完成二笔交易达到最大利润。对于第一种情况:直接基于(股票的最大价值题)。那么对于第二种情况:我们可以把数组差成两部分的思想来做。什么意思呢》比如第i天为分界点,那么我们把第0到第i天内进行第一笔交易,第i+1到第n-1天进行第二笔交易。(1<=i<=n-2)。基于上叙思想,我们可以写个状态转移方程。
      • 第0到第i天内进行第一笔交易:pre[i] 表示前i天内,进行一次交易能达到的最大价值。转移点怎么写呢,可以类比0-1背包的思想。前i天内,在第i天卖出还是不在第i天卖出这个状态点写一个状态转移方程,不在第i天卖出:相当于pre[i-1];在第i天卖出:arr[i]-preMin(preMin指的前i-1天股票的最小值)
      • 因此状态转移方程为:pre[i] = max(pre[i-1],arr[i]-preMin);
      • 同理;第i+1到第n-1天进行第二笔交易:back[i]表示第i到n-1天内,进行一次交易能达到的最大价值。转移点怎么写呢,同样类比0-1背包的思想。第i到n-1天内,在第i天买入还是不在第i天买入这个状态点写一个状态转移方程,不在第i天买入:相当于back[i+1];在第i天买入:backMax-arr[i](backMax指的第i+1天到第n-1天股票的最大值)
      • 因此状态转移方程为:back[i] = max(back[i-1],backMax-arr[i]);
      • 那么得出两个状态数组,我们可以利用 max(pre[i]+back[i+1])得到两笔交易的最大价值 (0=<i<len-1)pre[len-1] 为进行一笔交易的最大值
    • 代码:(java 时间O(N) 空间O(N))
      class Solution {
          public int maxProfit(int[] prices) {
              if(prices==null||prices.length<=0) return 0;
              int len = prices.length;
              int pre[] = new int[len];//表示前i天内,进行一次交易能达到的最大价值
              int preMin = prices[0];
              int curMax = 0;
              for(int i=1;i<len;i++){
                  if(curMax<prices[i]-preMin){
                      curMax = prices[i]-preMin;
                  }
                  pre[i] = Math.max(pre[i-1],curMax); //curMax指前i天 进行一次交易且第i天卖出所达到的最大值
                  preMin = Math.min(preMin,prices[i]);
              }
              int back[] = new int[len]; //表示第i天到第n-1天内,进行依次交易能达到的最大价值
              int bacMax = prices[len-1];
              curMax = 0;
              for(int j=len-2;j>=0;j--){
                  if(curMax<bacMax-prices[j]){
                      curMax = bacMax-prices[j];
                  }
                  back[j] = Math.max(back[j+1],curMax);
                  bacMax = Math.max(bacMax,prices[j]);
              }
              int res = 0;
              for(int i=0;i<len;i++){
                  if(i!=len-1){
                      res = Math.max(res,pre[i]+back[i+1]);
                  }else{
                      res = Math.max(res,pre[i]);
                  }
              }
              return res;
          }
      }
  • Best Time to Buy and Sell Stock with Transaction Fee (leetcode 714)
    • 题目:一个整数数组prices,其中prices[i]表示一天给定股票的价格;fee表示交易费用的非负整数。根据需要完成尽可能多的交易,但是需要为每笔交易支付交易费用。一次不能购买超过1股的股票(即必须在再次购买之前卖出股票。)
    • 思路:
      • 动态规划
        • 动态转移点:手上有没有股票 进行DP
        • 对于第i天的最大收益,应分成两种情况,一是该天结束后手里没有stock,可能是保持前一天的状态也可能是今天卖出了,此时令收益为cash;二是该天结束后手中有一个stock,可能是保持前一天的状态,也可能是今天买入了,用hold表示。由于第i天的情况只和i-1天有关,所以用两个变量cash和hold就可以,不需要用数组
        • 代码:
          class Solution {
              public int maxProfit(int[] prices, int fee) {
                  if(prices==null||prices.length<=1) return 0;
                  int buy = -prices[0];
                  int cash = 0;
                  for(int i=1;i<prices.length;i++){
                      cash = Math.max(cash,buy+prices[i]-fee);
                      buy = Math.max(buy,cash-prices[i]);
                  }
                  return cash;
              }
          }
      • 贪心算法:
        • 贪心选择的关键是找到一个最大后是不是能够卖掉stock,重新开始寻找买入机会。比如序列1 3 2 8,如果发现2小于3就完成交易买1卖3,此时由于fee=2,(3-1-fee)+(8-2-fee)<(8-1-fee),所以说明卖早了,令max是当前最大price,当(max-price[i]>=fee)时可以在max处卖出,且不会存在卖早的情况,再从i开始重新寻找买入机会。
        • 代码:
          class Solution {
              public int maxProfit(int[] prices, int fee) {
                  if(prices==null||prices.length<=1) return 0;
                  int profit=0;
                  int curProfit=0;
                  int minP=prices[0];
                  int maxP=prices[0];
                  int i;
                  for(i=1;i<prices.length;i++){
                      minP=Math.min(minP,prices[i]);
                      maxP=Math.max(maxP,prices[i]);
                      curProfit=Math.max(curProfit,prices[i]-minP-fee);
                      if((maxP-prices[i])>=fee){
                          profit+=curProfit;
                          curProfit=0;
                          minP=prices[i];
                          maxP=prices[i];
                      }
                  }
                  return profit+curProfit;
              }
          }
【LeetCode 热题 100】121.买卖股票的最佳时机(一次遍历 + 贪心策略,附图解 + Python 实现) 本文详细解析了 LeetCode 热门面试题「121. 买卖股票的最佳时机」,通过贪心算法实现一次遍历即可求解。文章介绍了如何维护最低买入价和最大利润,并提供了 Python 代码实现。关键细节包括使用 float('inf') 初始化最小价格和贪心算法的局部最优策略。图解过程帮助理解算法执行步骤,测试用例验证了代码的正确性。复杂度分析表明该算法时间复杂度为 O(n),空间复杂度为 O(1),适合大规模输入。文章还推荐了相关扩展题目,帮助读者进一步掌握股票交易类问题的解法。总结指出,本题是贪心策略的经典案例 阅读详情

相关推荐

基于离线数据的股票量化回测系统构建指南:从数据获取到模拟交易

量化交易的核心在于通过系统化方法验证投资策略的有效性,其基础是可靠的数据和严谨的回测。数据获取与处理是量化分析的基石,通常涉及从API或本地文件获取历史行情数据,并进行清洗、标准化以构建本地数据仓库。回测系统则模拟真实交易环境,通过历史数据验证策略逻辑,评估其风险收益特征,从而为实盘决策提供依据。在金融数据分析与算法交易领域,本地化回测系统能有效避免网络依赖与API限制,尤其适合初学者理解策略底层逻辑。本文以股票离线数据为切入点,详细讲解了如何使用Python构建完整的本地量化分析闭环,涵盖数据管理、策略回

weixin_29053695的博客 286

【LeetCode】Best Time to Buy and Sell Stock(买卖股票的最佳时机)

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

『诞生之时已至,以此修正万象』 413

Python机器学习量化投资实战:从数据到回测的完整框架构建

量化投资通过数学模型和计算机技术,将投资理念转化为可执行的交易策略。其核心原理在于利用历史数据挖掘市场规律,通过统计分析和机器学习算法识别潜在的盈利机会。这一方法的技术价值在于能够系统性地处理海量信息,克服人为情绪干扰,实现决策的客观性与纪律性。在应用场景上,量化策略广泛应用于股票、期货、衍生品等多个金融市场,进行趋势跟踪、套利、做市等操作。本文聚焦于构建一个基于Python的机器学习量化研究框架,详细阐述了从数据获取、特征工程到模型训练与回测的完整链路。其中,特征工程是制造Alpha信号的关键环节,而使用

weixin_32678995的博客 230

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

HTML5网页基础设计——课程介绍专栏

案例: 参考代码: <!doctype html> <html> <head> <meta charset="utf-8"> <title>动手实践</title> <style> *{ margin: 0; padding: 0; font-size:14px; } dd{ width: 461px; height: 145px; margin: -4px; pad.

shengming_tutou的博客 4594

【项目实战】基于STM32单片机的智能小车设计(有代码)

【1】背景意义 近些年随着国民生活水平的提升,以小车为载体的轮式机器人进入了我们的生活,尤其是在一些布线复杂困难的安全生活区和需要监控的施工作业场合都必须依赖轮式机器人的视频监控技术。因此,基于嵌入式技术的无线通信视频监控轮式机器人应运而生。由于它们与人类工作相比具有成本低廉、安全稳定的优点,目前已经在许多危险作业以及工业场合得到了广泛应用而且轮式机器人不需要像人那样采取过多的保护措施,因此轮式机...

ShawnWang1994的博客 13万+

[LeetCode ] Best Time to Buy and Sell Stock系列题解

这一系列的题目的基本模型是给出n天每天股票的价格,可以在任意一天买股票,在之后的任意一天把股票卖出,赚取差价,限制是手中最多有一张股票,必选把手中的股票卖掉才能再买股票。求最大获利。 题目1:Best Time to Buy and Sell Stock 这是最简单的一道题,在基本模型的基础上添加了一个限制条件,最多交易一次。 我们从第一天开始遍历,维护一个已经遍历过的股票的最小价格mi...

GYH0730的博客 574

手把手教你用Xilinx SelectIO IP核搞定ADS42LB69高速ADC的DDR数据采集(附仿真调试技巧)

本文详细介绍了如何使用Xilinx SelectIO IP核实现ADS42LB69高速ADC的DDR数据采集,包括IP核配置、仿真验证和硬件调试技巧。通过精准的时序控制和实战调试方法,解决高速数据采集中的时序对齐问题,提升系统稳定性和可靠性。特别适合FPGA工程师和高速ADC接口设计者参考。

weixin_42533622的博客 152

121. Best Time to Buy and Sell Stock

先写个暴力的,看看对题目的理解对不对。用两个循环,外层循环表示买入时候的价格,内层循环表示卖出时候的价格,遍历所有的情况,期间更新最大的收益。给一个数组,看作每天股票的价格,然后某一天买入,某一天卖出,最大收益可以是多少。可以不操作,收入就是。这种数组优化,经常就是考虑双指针的方法,从而使得两层循环变成一层。思考一下怎么定义指针的含义。用两个指针, buy 表示第几天买入,sell 表示第几天卖出。代码的话就很好写了。

猫敷雪 470

Python爬虫实战:5分钟搞定微信公众号文章阅读数、点赞数抓取(附完整代码)

本文详细介绍了如何通过Python爬虫技术自动化抓取微信公众号文章的阅读数和点赞数。文章从数据源分析入手,分步讲解了获取文章列表与提取单篇统计数据的完整流程,并提供了应对平台风控的策略与工程化整合方案,帮助开发者高效、合规地完成数据采集任务。

ansible6ops的博客 1336

从AXI到CHI:深入解析基于Credit的流量控制如何优化NoC设计

本文深入解析了从AXI握手式流控到CHI基于Credit的流量控制机制的演进。通过对比传统流控的瓶颈,详细阐述了Credit机制如何通过信用预分配和记账系统,有效解决FIFO气泡、时序收敛等难题,从而优化NoC设计的带宽利用率、降低延迟并提升系统可扩展性。

weixin_29227585的博客 522

leetcode [Best Time to Buy and Sell Stock II]//待整理多种解法

class Solution { public int maxProfit(int[] prices) { int res = 0; int low = 0, high = 0; if(prices.length == 0) return 0; high = prices[prices.length - 1];

Carmelo_Z的博客 291

【2025国赛C题】高教社杯全国大学生数学建模竞赛C题思路+代码+论文

【2025国赛C题】高教社杯全国大学生数学建模竞赛C题思路+代码+论文

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2902

Best Time to Buy and Sell Stock 买股票系列三连

Leetcode里的买卖股票系列非常有名。之前做过这个系列里面的三道,分别是:121 Best Time to Buy and Sell Stock其中第一道题的要求是只能交易一次,因此就是寻找数组内正向的最大差值,解法是维护一个min变量存储当前遇到的最低股价,维护一个max存储当前可能的最大利润(用当前股价减去min),一次顺序遍历数组最后返回max就ok了。代码:int maxProfit(...

lujie1996的博客 2385

YOLOv11涨点改进 | 全网独家首发、特征融合创新篇 | ACM 2025顶会 | 引入DAAttn差异感知注意力融合模块,通过动态调整注意力,使模型更准确地识别关键内容,提高精度、并减少冗余计算

本文提出了一种基于DAAttn(差异感知注意力融合)模块改进的YOLOv11模型,用于提升变化检测任务的性能。DAAttn模块通过动态加权特征差异,有效区分有意义变化与噪声(如光照、天气变化),显著提高了模型在复杂场景下的检测精度。该模块采用反转注意力机制,重点关注显著差异区域,同时减少计算冗余。实验表明,改进后的模型在保持计算效率的同时,能够更准确地识别小目标和细节变化。文章详细介绍了DAAttn的原理、优势、实现代码及其在YOLOv11中的集成方法,并提供了两种改进配置方案。

Ai缝合怪、助力小伙伴高效发论文 302

人工智能在慢病管理中的具体应用全集:从技术落地到场景创新

这一成果的取得,得益于 AI 对居民血压数据的实时监测和分析,以及及时的干预措施。据统计,医疗支出下降了 18%,这主要是由于 AI 慢病管理系统实现了对慢病患者的早筛早诊早治,减少了并发症的发生,降低了医疗资源的浪费,从而减轻了患者和社会的医疗负担。医院信息系统(HIS)、电子病历(EMR)、区域卫生平台、可穿戴设备(如三诺血糖仪、华为手环)、第三方健康APP以及体检中心的数据往往采用不同的数据标准和格式(如HL7、FHIR、JSON、CSV等),且存储在相互隔离的系统中,形成典型的数据孤岛。

AllenLV的博客 2091

python解答leetcode best time to buy and sell stock

解答 leetcode (python) best time to buy and sell stock leetcode/problems/121.best-time-to-buy-and-sell-stock.md Say you have an array for which the ith element is the price of a given stock on day i. If...

weixin_45230118的博客 392

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Best Time to Buy and Sell Stock(C++股票的最大利润)

Best Time to Buy and Sell Stock(C++股票的最大利润)

coolsunxu的博客 158

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

Best Time to Buy and Sell Stock股票交易--力扣101算法题解笔记

给定一段时间内每天的股票价格,已知你只可以买卖各一次,求最大的收益。

c3152144837的博客 56

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Algorithms(五)Best Time to Buy and Sell Stock

题目: 121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transactio

cai_yt_的博客 248

121. Best Time to Buy and Sell Stock 122. Best Time to Buy and Sell Stock II

【代码】121. Best Time to Buy and Sell Stock 122. Best Time to Buy and Sell Stock II。

Fai_B的博客 968

LeetCode : Best Time to Buy and Sell Stock III & IV

首先让我们来考虑一下III的DP做法class Solution { public: int maxProfit(vector& prices) { int buy1 = INT_MIN,buy2 = INT_MIN; int sell1 = 0, sell2 = 0; for(int i=0;i<prices.size();i++){

brandzhang的专栏 381

leetcode

题目链接 https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/ 题目描述 给定一个整数数组prices,其中第i个元素代表了第i天的股票价格 ;非负整数fee 代表了交易股票的手续费用。 你可以无限次地完成交易,但是你每次交易都需要付...

qq_38043440的博客 235

Best Time to Buy and Sell Stock

题目: 假设有一个数组,它的第i项是第i天的股票价格。如果你最多只能进行一次买卖操作(买一次,卖一次),设计一个算法求出最大的收益。 思路方法 直观的理解,就是求数组中 max(array[j]-array[i]), j>=i。用两重循环求出每一对不同i,j的差值,这样做会超时,所以要用更巧妙的方法。 实际上,这道题本质上是个动态规划问题。 class Solution(object): def maxProfit(self, prices): """ ..

具身机器人和通用AI 365

123. Best Time to Buy and Sell Stock III

     这几天leetcod刷题没有断过,easy和medium一般没有啥好说的,思路一般都还比较简单,今天主要对123这道题进行分析,其实这道题最大的难点在于有限的交易次数和不可同时持有两个股份,时间复杂度是O(n),空间复杂度是O(n)的思路还是比较简单的,大体上就是有限的几天内找一个点,这个点之前买卖的最高收益加上这点之后买卖的最高收益就是全局最优解,相应的,一个顺序记录最高收益,一个倒序...

qq_29592167的博客 662

算法题目---Best Time to Buy and Sell Stock

题目来源 https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/ 题目描述 Say you have an array for which the i*th element is the price of a given stock on day *i. If you were onl

zhengjf9的博客 269
上一篇: Spring IOC AOP归纳总结
下一篇: 从GIT上导入项目到idea 配置SSH 秘钥 过程 MAC版
Mike_CSU
博客等级 码龄10年 6粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值