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

我在leetcode用动态规划炒股

事情是这样的,突然兴起的我在letcode刷题

  • 121. 买卖股票的最佳时机
  • 122. 买卖股票的最佳时机 II
  • 123. 买卖股票的最佳时机 III

以上三题。

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

在这里插入图片描述

1.1. 暴力遍历,两次遍历

1.1.1. 算法代码

public class Solution {public int MaxProfit(int[] prices) {int profitValue=0;for(int i=0;i<prices.Length;i++){for(int j=i+1;j<prices.Length;j++){if(prices[j]>prices[i]){if(prices[j]-prices[i]>profitValue){profitValue=prices[j]-prices[i];}}}}return profitValue;}
}

上述代码的逻辑为两次遍历,后一个值比前一个值大,并使用哨兵变量profitValue记录最大差值。

1.1.2. 算法复杂度

  • 时间复杂度: O ( n 2 ) = n ∗ ( n − 1 ) 2 O(n^2)=\frac {n*(n-1)}{2} O(n2)=2n(n1)
  • 空间复杂度: O ( 1 ) O(1) O(1),因为只有哨兵变量profitValue

1.1.3. 算法问题

前面我们讲到,这个时间复杂度是 O ( n 2 ) O(n^2) O(n2),是一个指数函数。

那么在数据非常大的时候,其根据时间复杂度可以知道,其复杂度非常的高,如leetcode的超时案例

[886,729,539,474,5,653,588,198,313,111,38,808,848,364,819,747,520,568,583,253,605,442,779,903,217,284,927,33,859,75,418,612,174,316,167,40,945,740,174,279,985,133,38,919,528,844,101,291,673,561,.......
中间有3万个数值
.......561,644,484,868,53,936,186,35,219,84,455,971,922,862,434,553,948,857,491,622,162,934,66,486,569,690,596,506,452,635,690]

其时间复杂度是: 30000 ∗ 29999 / 2 = 449985000 30000*29999/2=449985000 3000029999/2=449985000,其计算数值大的可怕。

1.2. 一次遍历

1.2.1. 算法代码

public class Solution {public int MaxProfit(int[] prices) {int minprice = int.MaxValue;int maxprofit = 0;for (int i = 0; i < prices.Length; i++) {if (prices[i] < minprice) {minprice = prices[i];} else if (prices[i] - minprice > maxprofit) {maxprofit = prices[i] - minprice;}}return maxprofit;}
}

其算法,基本思路是:在最低点购入,在最高点卖出,由于for循环是从0开始的,所以其每一次minprice是当前时点前最低点购入值,故此算法可靠

1.2.2. 算法复杂度

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) = 2 O(1)=2 O(1)=2

2.2 122. 买卖股票的最佳时机 II

在这里插入图片描述

第一题相较比较简单,而第二题中增加了一个限定:可以购买多次,只是手上最多只有一支股票

2.1. 贪心算法

2.1.1. 算法代码

public class Solution {public int MaxProfit(int[] prices) {int ans = 0;int n = prices.Length;for (int i = 1; i < n; ++i) {int diffPrice=prices[i] - prices[i - 1];if(diffPrice>0){ans += diffPrice;}}return ans;}
}

2.1.2. 算法思路与步骤

只要后一天的价格比今天高,那么我今天就买,后一天就卖。

在这里插入图片描述

2.1.3. 算法复杂度

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) = 2 O(1)=2 O(1)=2

2.2. 动态规划算法

2.2.1. 算法代码

public class Solution {public int MaxProfit(int[] prices) {if (prices.Length < 2) {return 0;}int[] OwnStocks=new int[prices.Length];int[] NoStocks=new int[prices.Length];OwnStocks[0]=-prices[0];NoStocks[0]=0;for(int i=1;i<prices.Length;i++){OwnStocks[i]=Math.Max(OwnStocks[i-1],NoStocks[i-1]-prices[i]);NoStocks[i]=Math.Max(NoStocks[i-1],OwnStocks[i-1]+prices[i]);}return NoStocks[prices.Length-1];}
}

2.2.2. 算法思路与步骤

  • 由于不可以同时存在多支股票,所以每天只有可能有两种状态有股票没有股票
  • 第一天存在股票=0-第一天股票价值;第一天不存在股票=0(没有购买或者当天售出)
  • 后续每一天,当天有股票的最大利益=Math.Max(前一天有股票的值,前一天没有股票的值-当天股票值[购买股票])
  • 后续每一天,当前没有股票的最大利益=Math.Max(前一天没有股票的值,前一天有股票的值+当天股票值[卖出股票]`)

图解如下:

在这里插入图片描述

2.2.3. 算法复杂度

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) = 2 n O(n)=2n O(n)=2n

2.3. 123. 买卖股票的最佳时机 III

在这里插入图片描述

2.3.1. 动态规划算法

这一题就和第二题的动态规划类似,只是第二题是两个状态,而第三题是四个状态。

  • 没有买入
  • 第一次买入,没有卖出
  • 第一次买出,没有卖入
  • 第二次买入,没有卖出
  • 第二次买出

由于没有买入全程是0所以不做考虑,列出了5种,但实际上只有4种状态。

2.3.2. 算法代码

public class Solution {public int MaxProfit(int[] prices) {if(prices.Length<2){return 0;}int oneBuy=-prices[0];int oneSale=0;int twoBuy=-prices[0];int twoSale=0;for(int i=1;i<prices.Length;i++){oneBuy=Math.Max(oneBuy,-prices[i]);oneSale=Math.Max(oneSale,oneBuy+prices[i]);twoBuy=Math.Max(twoBuy,oneSale-prices[i]);twoSale=Math.Max(twoSale,twoBuy+prices[i]);}return twoSale;}
}

2.3.3. 算法复杂度

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) = 4 O(1)=4 O(1)=4

相关文章:

我在leetcode用动态规划炒股

事情是这样的&#xff0c;突然兴起的我在letcode刷题 121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II123. 买卖股票的最佳时机 III 以上三题。 1. 121. 买卖股票的最佳时机 1.1. 暴力遍历&#xff0c;两次遍历 1.1.1. 算法代码 public class Solution {public int Ma…...

rust实践-异步并发socket通信

客户端 [package] name = "rust_client" version = "0.1.0" edition = "2021"[dependencies] tokio = {version = "1.14.0", features = ["full"] }use tokio::io::{self, AsyncReadExt, AsyncWriteExt}; use tokio::net::…...

SolidUI社区-根据Prompt打造人设

背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…...

设计模式行为型——观察者模式

目录 什么是观察者模式 观察者模式的实现 观察者模式角色 观察者模式类图 观察者模式举例 观察者模式代码实现 观察者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式…...

Kernel Exception导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、高温触发 Kernel Exception 重启问题二、解决方案三、提高电池温度方案 一、 高温触发 Kernel Exception 重启问题 手机 电池温度 默认60度以上高温…...

C++入门篇5---模板

相信大家都遇到过这么一种情况&#xff0c;为了满足不同类型的需求&#xff0c;我们要写多个功能相同&#xff0c;参数类型不同的代码&#xff0c;为此&#xff0c;C引入了泛型编程这一概念&#xff0c;而模板就是实现泛型编程的基础&#xff0c;其实本质就是我们写一个类似”模…...

L2CS-Net: 3D gaze estimation

L2CS-Net: Fine-Grained Gaze Estimation in Unconstrained Environments论文解析 摘要1. 简介2. Related Work3. METHOD3.1 Proposed loss function3.2 L2CS-Net 结构3.3 数据集3.4 评价指标 4. 实验4.1 实验结果 论文地址&#xff1a;L2CS-Net: Fine-Grained Gaze Estimation…...

kenernetes/k8s笔试面试

k8s的基础概念 k8s本质是一个容器编排系统&#xff0c;可以管理容器的生命周期&#xff0c;应用部署&#xff0c;更新&#xff0c;维护&#xff0c;应用提供服务&#xff0c;扩容缩容应用&#xff0c;故障自愈。 k8s与docker的关系 docker:是一种轻量级的虚拟化技术。运维层…...

我们真的是在做数据治理吗

我们真的是在做数据治理吗&#xff1f; 什么是数据治理&#xff1f; 数据治理和数据管理有什么区别&#xff1f; 相信即使是考过数据治理工程师的人&#xff0c;面对这2个问题也仍然会有这个疑问。 目前国际和国内对于数据治理没有明确统一的定义&#xff0c;对于数据治理的服…...

聊聊汽车电子的话题

当谈到汽车电子时&#xff0c;有许多有趣的话题可以探讨。以下是一些可能感兴趣的话题&#xff1a; 自动驾驶技术&#xff1a;自动驾驶技术正变得越来越先进&#xff0c;它们如何在汽车中实现&#xff1f;它们将如何改变我们的交通方式以及对道路安全的影响&#xff1f; 电动汽…...

ThinkPHP6企业OA办公系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6企业OA办公系统 一 介绍 勾股OA基于ThinkPHP6开发&#xff0c;前端Layui&#xff0c;数据库mysql&#xff0c;是一款实用的企业办公系统。可多角色登录&#xff0c;集成了系统设置、人事管理、消息管理、审批管理、日常办公、客户…...

PPS Tester测量原理和实施方法

怿星科技发布了新品PPS Tester&#xff0c;这是一款基于1PPS方法的时间同步精度测试设备。PPS Tester由硬件模块ETS2110和上位机软件ePPSTester构成。本文将围绕此设备的应用场景&#xff0c;介绍相关概念和设备使用方法。 什么是时间同步&#xff1f; 时间同步就是采取某项技…...

浅谈新电改背景下电网企业综合能源服务商业模式研究及发展方向

安科瑞 华楠 摘要: 新电改方案实施后&#xff0c;由于输配电价的改革和售电侧的放开&#xff0c;电网企业的盈利模式也随之发生了变化。这就要求电网企业转变服务理念与经营方式&#xff0c;来寻求竞争优势。基于“魏朱六要素商业模式”模型&#xff0c;对电网企业综合能源服务…...

SpringBoot + Docker 实现一次构建到处运行~

一、容器化部署的好处 图片 Docker 作为一种新兴的虚拟化方式&#xff0c;它可以更高效的利用系统资源&#xff0c;不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟&#xff0c;而 Docker 容器应用&#xff0c;由于直接运行…...

clang-format格式化代码

1. clang-format简介 Clang-Format可用于格式化&#xff08;排版&#xff09;多种不同语言的代码。其自带的排版格式主要有&#xff1a;LLVM, Google, Chromium, Mozilla, WebKit等; 利用style参数配置风格。通过编写 .clang-format 文件&#xff0c;可以实现代码风格的配置。…...

品牌宣传与媒体传播是声誉管理的主要方式之一

企业声誉是现如今影响品牌信任度、客户忠诚度的重要因素&#xff0c;也被视为企业的一种无形资&#xff0c;更影响着企业未来的发展。因此&#xff0c;企业声誉管理也日渐成为企业管理的重要课题之一&#xff0c;尤其在品牌营销管理领域。 什么是声誉管理&#xff1f;声誉管理有…...

2023年8月7日-8月13日,(上午熟悉公司代码,周一到周五晚上优先工作所急视频教程,其他业余时间进行ue视频教程,为独立游戏做准备)

按照规划&#xff0c;上午熟悉公司源码&#xff0c;下午进行filament和ue渲染&#xff0c;晚上写工作代码。回家后泛读pbrt或者其他书籍催眠。 业余学习ue的各种视频教程&#xff0c;为独立游戏做准备&#xff08;公司也实行末位淘汰&#xff0c;给自己留条后路&#xff09;。累…...

Vue3 第二节 Vue3的响应式

1.Vue3的响应式原理 2.ref函数和reactive函数的对比 3.setup注意点 一.Vue3的响应式原理 1.Vue2.x中的响应式原理 ① 实现原理 对象类型&#xff1a;通过Object.defineProperty() 对属性的读取&#xff0c;修改进行拦截&#xff08;数据劫持&#xff09;数组类型&#xf…...

通过easyui实现动态控制表格字段显示、导出表格数据

前言 学过layui前端框架的都知道&#xff0c;layui默认帮我们实现了控制表格字段显示以及数据的导出功能。 1、控制表格字段显示 2、数据导出 3、导出为pdf&#xff1a;导出按钮的右边那个按钮就是打印pdf的 那么&#xff0c;easyui要怎么实现这些功能呢&#xff1f;这篇文章就…...

JWT入门,jwt可以解密吗?

JWT 什么是 JWT JSON Web Token&#xff0c;通过数字签名的方式&#xff0c;以 JSON 对象为载体&#xff0c;在不同的服务终端之间安全地传输信息 官网&#xff1a;https://jwt.io/SDK: https://jwt.io/libraries (含Java和各种语言)Java SDK(上面的SDK链接得到): https://g…...

新时达电脑调试软件上位机:支持256种全协议,便捷实现系统参数导入导出与备份

新时达软件上位机&#xff0c;256全协议 新时达电脑调试软件多协议&#xff0c;方便用电脑调试系统&#xff0c;可以从电脑导入 和导出参数到电脑保存控制柜前蹲半小时协议选错的痛&#xff0c;你懂不懂&#xff1f;U盘插了拔拔了插还是提示版本格式不匹配的烦躁&#xff0c;你…...

安防相机WDR功能实测:逆光场景下如何拍清车牌和人脸?

安防相机WDR功能实战解析&#xff1a;逆光场景下的车牌与人脸清晰拍摄指南 停车场出入口的监控画面中&#xff0c;一辆黑色轿车缓缓驶过&#xff0c;阳光从车尾方向直射镜头&#xff0c;车牌区域瞬间变成一片刺眼的白光——这是安防工程中最令人头疼的逆光场景。现代宽动态范围…...

使用RyTuneX提升Windows性能:系统优化全指南

使用RyTuneX提升Windows性能&#xff1a;系统优化全指南 【免费下载链接】RyTuneX RyTuneX is a cutting-edge optimizer built with the WinUI 3 framework, designed to amplify the performance of Windows devices. Crafted for both Windows 10 and 11. 项目地址: https…...

3分钟上手VSCode Mermaid Preview:在IDE中实现可视化图表实时预览

3分钟上手VSCode Mermaid Preview&#xff1a;在IDE中实现可视化图表实时预览 【免费下载链接】vscode-mermaid-preview Previews Mermaid diagrams 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-mermaid-preview 还在为编写Mermaid图表时需要在代码编辑器与预览…...

[TI板]MSPM0G3507开发全攻略:从环境搭建到实战应用

1. 环境配置&#xff1a;从零搭建MSPM0G3507开发环境 第一次接触TI的MSPM0G3507开发板时&#xff0c;最头疼的就是环境搭建。我花了整整两天时间踩遍了所有坑&#xff0c;现在把最顺滑的配置流程分享给你。这个芯片支持Keil、IAR和CCS三大主流IDE&#xff0c;但实测下来Keil的兼…...

Qwen3.5-9B应用场景:开发者日常——Stack Overflow式问答+Debug辅助

Qwen3.5-9B应用场景&#xff1a;开发者日常——Stack Overflow式问答Debug辅助 1. 开发者新利器&#xff1a;Qwen3.5-9B大模型 作为一名开发者&#xff0c;你是否经常遇到这样的场景&#xff1a;深夜调试代码时遇到报错&#xff0c;Stack Overflow上找不到满意答案&#xff1…...

保姆级教程:手把手教你下载SEED-VIG脑电数据集(附Gitee国内镜像地址)

从零到一&#xff1a;SEED-VIG脑电数据集的完整获取与解析指南 第一次接触SEED-VIG数据集时&#xff0c;我花了整整三天时间才搞明白如何正确下载和解析这个2.9GB的庞然大物。作为研究驾驶疲劳检测的重要资源&#xff0c;这个数据集的价值毋庸置疑&#xff0c;但获取过程却让不…...

开源工具Wand Enhancer功能解锁技术指南

开源工具Wand Enhancer功能解锁技术指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer Wand Enhancer作为一款开源工具&#xff0c;通过本地验证技术为…...

3个技巧:如何用开源工具彻底解决Beyond Compare授权难题

3个技巧&#xff1a;如何用开源工具彻底解决Beyond Compare授权难题 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 当Beyond Compare 5的30天评估期结束后&#xff0c;用户常常会遇到"评估…...

URP Scriptable Renderer Feature实战:从原理到自定义后处理

1. URP Scriptable Renderer Feature基础认知 第一次接触URP的Scriptable Renderer Feature时&#xff0c;我完全被各种专业术语搞晕了。后来在实际项目中反复折腾才发现&#xff0c;这东西本质上就是个"特效插件系统"。想象你正在玩一款射击游戏&#xff0c;当角色受…...