LeetCode买卖股票的最佳时机
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 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
1 <= prices.length <= 1050 <= prices[i] <= 104
代码
class Solution {public int maxProfit(int[] prices) {int res =0; // 记录最大利润int sell = 0; // 记录何时卖股票的指针int buy = prices[0]; // 当前买入的价格while(sell < prices.length){int price = prices[sell]; res = Math.max(price - buy,res); // 如果当前卖股票的收益大于当前利润,则更新利润buy = Math.min(price,buy); // 如果当前买入股票的价格小于之前买入股票的价格,则在当前买入sell++;}return res;}
}
122 买卖股票的最佳时间Ⅱ
题目描述
给你一个整数数组 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 * 1040 <= prices[i] <= 104
代码
class Solution {public int maxProfit(int[] prices) {int res = 0;int buy = prices[0];int sell = 0;while(sell < prices.length){int price = prices[sell];if(price > buy){res += price - buy;}buy = price;sell++;}return res;}
}
与Ⅰ的不同之处在于只要卖出价格大于买入价格即可卖出。
123 买卖股票的最佳时机Ⅲ
题目描述
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入:prices = [3,3,5,0,0,3,1,4]
输出:6
解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。
示例 2:
输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这个情况下, 没有交易完成, 所以最大利润为 0。
示例 4:
输入:prices = [1]
输出:0
提示:
1 <= prices.length <= 1050 <= prices[i] <= 105
代码一(会超时)
可以尝试将数组切分成两份,这样就能将问题转化为买卖股票的最佳时机Ⅰ,只要分别求两个子数组的最大利润并相加即可。
class Solution {public int getMax(int[] prices){int res = 0;int buy = prices[0];int sell = 0;while(sell < prices.length){int price = prices[sell];res = Math.max(res,price-buy);buy = Math.min(price,buy);sell++;}return res;}public int maxProfit(int[] prices) {int res = 0;int tem1=0,tem2 = 0;for(int i=1;i<prices.length;i++){tem1 = getMax(Arrays.copyOfRange(prices,0,i));tem2 = getMax(Arrays.copyOfRange(prices,i-1,prices.length));res = Math.max(res,tem1+tem2);}return res;}
}
代码二(dp)
用dp1[i]来记录从第一天开始到第 i 天时能获得的最大利润;
用dp2[i]来记录从最后一天开始到第 i 天时能获得的最大利润。
dp1[i] + dp2[i] 即为买卖两次能获得的利润。
class Solution {public int maxProfit(int[] prices) {int len = prices.length;int[] dp1 = new int[len];int[] dp2 = new int[len];int buy1 = prices[0];int sell2 = prices[len-1];for(int i=1;i<len;i++){int price = prices[i];dp1[i] = Math.max(dp1[i-1],price - buy1);buy1 = Math.min(buy1,price); }for(int i=len-2;i>=0;i--){int price = prices[i];dp2[i] = Math.max(dp2[i+1],sell2 - price);sell2 = Math.max(sell2,price);}int res = 0;for(int i=0;i<len;i++){res = Math.max(res,dp1[i] + dp2[i]);}return res;}
}
188 买卖股票的最佳时机Ⅳ
题目描述
给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。
**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入:k = 2, prices = [2,4,1]
输出:2
解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
示例 2:
输入:k = 2, prices = [3,2,6,5,0,3]
输出:7
解释:在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。
提示:
1 <= k <= 1001 <= prices.length <= 10000 <= prices[i] <= 1000
代码
用一个二维数组dp[i][j]记录买卖 i 次时到第 j 个元素所能获得的最大利润
当第 i (i >= 2)次卖出时的,若买入的时间为buy,则此时的利润为:dp[i-1][buy] + 买卖价格差。
class Solution {public int maxProfit(int k, int[] prices) {int len = prices.length;int[][] dp = new int[k][len];for(int i=0;i<k;i++){if(i==0){int buy = prices[0];for(int j=1;j<len;j++){int price = prices[j];dp[i][j] = Math.max(dp[i][j-1],price - buy);buy = Math.min(buy,price);}}else{ for(int j=1;j<len;j++){int buy = 0;int price = prices[j];while(buy<j){dp[i][j] = Math.max(dp[i-1][buy]+price - prices[buy],dp[i][j]);buy++;}dp[i][j] = Math.max(dp[i][j],dp[i][j-1]);}}}return dp[k-1][len-1];}
}
相关文章:
LeetCode买卖股票的最佳时机
LeetCode买卖股票的最佳时机 121 买卖股票的最佳时机Ⅰ 题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计…...
Codeforces Round 932 (Div. 2)----->A. Entertainment in MAC
一,思路: 简单的字符串处理,当反转字符串后如果字典序减小了,那么肯定不会再执行反转操作,而是执行操作2,将反转后的字符串拼接(这样必定构造一个回文串),那么之后的操作…...
【JavaScript】 短路运算的妙用 ||
短路运算的妙用 下方举例中的写法技巧,在实际开发中,经常用到。这种写法,是一种很好的「容错、容灾、降级」方案,需要多看几遍。 1、JS 中的&&属于短路的与: 如果第一个值为 false,则不会执行后面的…...
密码学之椭圆曲线
引言 DH(Diffie-Hellman)密钥交换算法于1976年提出,是第一个公开密钥交换算法。其基础是数学中的群论,群论也是大多数公开密钥密码的基础。简单来说,群是一组元素的集合以及在这些元素上定义的特殊二元运算。 一个群需要满足如下性质: 封闭性:群中两个元素的运算结果仍…...
overleaf latex 笔记
overleaf: www.overleaf.com 导入.tex文件 1.代码空一行,代表文字另起一段 2. 1 2 3 排序 \begin{enumerate} \item \item \item \end{enumerate} 3.插入图片 上传图片并命名 \usepackage{float}导包\begin{figure}[H]:表示将图…...
第十五届蓝桥杯青少组STEMA测评SPIKE初级真题试卷 2024年1月
第十五届蓝桥杯青少组STEMA测评SPIKE初级真题试卷 2024年1月 来自:6547网 http://www.6547.cn/doc/vywur8eics...
10个常见的Java面试问题及其答案
问题: Java的主要特性是什么? 答案: Java的主要特性包括面向对象、平台无关、自动内存管理、安全性、多线程支持、丰富的API和强大的社区支持。 问题: 什么是Java的垃圾回收机制? 答案: Java的垃圾回收机…...
Vue跳转页面传递参数
Vue跳转页面传递参数 🌟 前言 欢迎来到我的小天地,这里是我记录技术点滴、分享学习心得的地方。📚 🛠️ 技能清单 编程语言:Java、C、C、Python、Go、前端技术:Jquery、Vue.js、React、uni-app、EchartsUI…...
【已解决】conda环境下ROS2 colcon build编译选择特定python解释器
目录 1 问题背景2 问题探索3 问题解决4 告别Bug 1 问题背景 环境: ROS2 HumbleUbuntu22.04 现象:运行colcon build后由cpp编译生成的python导出库(如自定义消息、服务等),其版本与由python setup.py安装的python库版本不一致,导致…...
QT C++实践| 连接数据库的登录界面实现| 附源码
前言 在之前的两篇博客中QT C实战:实现用户登录页面及多个界面跳转、QT C实践|超详细数据库的连接和增删改查操作|附源码分别详细讲解了:登录界面的制作(UI布局、页面跳转、登录逻辑等)、QT如何连接Mysql数据库,并进行…...
html样式排版
<template><div class"box"><div class"header">头部</div><div class"main"><div class"left">菜单</div><div class"right"><div class"right-contentr"&g…...
Java:性能优化细节31-45
Java:性能优化细节31-45 31、合理使用java.util.Vector 在使用java.util.Vector时,需要注意其性能特性和最佳实践,以确保应用程序运行高效。Vector是一个同步的集合类,提供了动态数组的实现。由于它是线程安全的,所以…...
YOLOv9独家原创改进|增加SPD-Conv无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块
专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、文章摘要 卷积神经网络(CNNs)在计算即使觉任务中如图像分类和目标检测等取得了显著的成功。然而,当图像分辨率较低或物体较小时&…...
Android Gradle开发与应用 (四) : Gradle构建与生命周期
1. 前言 前几篇文章,我们对Gradle中的基本知识,包括Gradle项目结构、Gradle Wrapper、GradleUserHome、Groovy基础语法、Groovy语法概念、Groovy闭包等知识点,这篇文章我们接着来介绍Gradle构建过程中的知识点。 2. Project : Gradle中构建…...
[MRCTF2020]Transform1
a[33]"9,10,15,23,7,24,12,6,1,16,3,17,32,29,11,30,27,22,4,13,19,20,21,2,25,5,31,8,18,26,28,14" b[33]"103,121,123,127,117,43,60,82,83,121,87,94,93,66,123,45,42,102,66,126,76,87,121,65,107,126,101,60,92,69,111,98,77" python代码 a3 [103…...
JavaWeb HTTP 请求头、请求体、响应头、响应体、响应状态码
J2EE(Java 2 Platform Enterprise Edition)是指“Java 2企业版”,B/S模式开发Web应用就是J2EE最核心的功能。 Web是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。 在日常的生活中,经常会使用…...
穿越数字防线:SSH协议的全景解析与未来展望
SSH基本概念 SSH(Secure Shell)是一个用于计算机网络的加密协议,设计用来提供一种安全的方式通过不安全的网络进行远程登录和其他网络服务。SSH协议主要用于远程管理系统和安全地传输信息。 SSH的历史背景 SSH由Tatu Ylnen于1995年开发&am…...
语文教学方法有哪些,产生了什么效果
你是否曾想过,一位普通的语文老师如何化身为智慧的引导者,点燃学生心中的求知之火?让我们一起探寻那些神奇的语文教学方法,以及它们带来的深远影响。 不仅让知识变得容易理解,更在无形中培养了学生的各项能力。通过谈话…...
Docker之网络配置
目录 一. Docker网络介绍 1.1 网络模式 1.2 bridge模式(默认模式) 1.2.1 什么是桥接模式 1.2.2 效果演示 1.2.3 桥接模式的特点 1.3 host模式 1.3.1 什么是host模式 1.3.2 仅主机模式的特点 二. Docker网络实操 2.1 bridge桥接模式 2.1 host仅主机模式 三. Docker自定义网络…...
Mybatis实现分页查询数据(代码实操讲解)
在MyBatis中实现分页查询的常见方式有两种:使用MyBatis内置的分页插件如PageHelper,或者手动编写分页的SQL语句。下面我将为你提供两种方式的示例代码。 使用PageHelper分页插件 首先,确保你的项目中已经添加了PageHelper的依赖。在Maven项…...
数据仓库核心概念:事实表和维度表详解与实战应用
数据仓库核心概念:事实表和维度表详解与实战应用一、引言二、定义:什么是事实表?什么是维度表?2.1 事实表:定义2.2 维度表:定义三、结构流程图:事实表与维度表关联关系3.1 标准星型模型关联流程…...
STM32实战:sprintf格式化字符串在嵌入式LCD显示中的高效应用
1. sprintf函数在STM32开发中的基础应用 第一次在STM32上使用sprintf函数时,我被它的强大功能惊艳到了。这个看似简单的函数,却能帮我们把各种数据类型转换成整齐的字符串,这在嵌入式开发中简直是神器。记得当时我在调试一个温湿度传感器项目…...
告别重复造轮子:用快马AI一键生成嵌入式Modbus协议栈提升效率
作为一名嵌入式开发者,我经常需要为各种项目实现Modbus通信协议。每次从零开始编写协议栈不仅耗时,还容易引入低级错误。最近尝试用InsCode(快马)平台生成基础框架,效率提升明显,分享下具体实践过程。 传统开发痛点分析 在STM32项…...
用Arduino和TCS34725颜色传感器做个桌面小助手:自动识别物体颜色并控制RGB灯带
用Arduino和TCS34725打造智能色彩互动系统:从硬件搭建到场景应用 在创客圈里,色彩交互一直是个充满魅力的领域。想象一下:当你把一杯橙汁放在桌面上,周围的灯光自动变成温暖的橙色;放上一本蓝色封面的书,工…...
基于pyqt的规则匹配的恶意代码检测系统
当前的恶意代码检测研究中,尽管传统特征匹配(signature-based detection)仍然广泛应用,但面对快速更新且具有混淆、加壳、动态加载、自变异(polymorphism/metamorphism)等能力的新型恶意代码&am…...
告别‘夜盲症’:用Python+OpenCV手把手教你实现红外与可见光图像融合(附完整代码)
实战指南:PythonOpenCV实现红外与可见光图像融合技术 夜间监控画面总是模糊不清?自动驾驶系统在低光照环境下识别率骤降?这些问题本质上都是"视觉夜盲症"的表现。今天我们将用最实用的方式,带你用Python和OpenCV构建一个…...
Kivy中文显示乱码?3步搞定字体配置(附免费字体下载)
Kivy中文显示乱码?3步搞定字体配置(附免费字体下载) 当你在Kivy应用中看到中文变成一堆问号或方框时,别急着怀疑人生——这通常是字体配置的小问题。作为Python生态中最受欢迎的跨平台GUI框架之一,Kivy默认使用Roboto字…...
Z-Image-Turbo_Sugar脸部Lora部署案例:科研团队构建可复现实验人脸数据集
Z-Image-Turbo_Sugar脸部Lora部署案例:科研团队构建可复现实验人脸数据集 1. 项目背景与价值 在计算机视觉和人工智能研究领域,高质量、标准化的人脸数据集对于模型训练和算法验证至关重要。传统的人脸数据收集面临诸多挑战:数据隐私问题、…...
51单片学习ing
现在能够实现LED闪烁了!! 开心 今天学习了让LED闪烁以及LED流水灯,主要是了解了软件延时计算器这个工具 现在可以更灵活的变换LED的变换速度了,如下: 接下来学习到了c语言里模块化的思想,之前学习c的时候…...
intv_ai_mk11应用场景:新媒体运营——热点事件评论草稿、标题党生成、互动话术
intv_ai_mk11在新媒体运营中的三大实战应用 1. 新媒体运营的痛点与AI解决方案 新媒体运营人员每天面临三大核心挑战:快速跟进热点事件、创作吸引眼球的标题、设计有效的互动话术。传统人工创作方式不仅耗时耗力,而且难以保证持续高质量输出。 intv_ai…...
