Python面试宝典第9题:买卖股票

题目

        给定一个整型数组,它的第i个元素是一支给定股票第i天的价格。如果最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。

        示例 1:

输入: [7, 1, 5, 3, 6, 4]
输出: 5
解释: 在第2天(股票价格=1)的时候买入,在第5天(股票价格=6)的时候卖出,最大利润为6-1=5。
注意:利润不能是7-1=6, 因为卖出价格需要大于买入价格;同时,不能在买入前卖出股票。

        示例 2:

输入: [7, 6, 4, 3, 1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为0。

暴力法

        暴力法的基本思想是尝试数组中每一种可能的买卖组合,即先遍历每一个可能的买入日子,然后对于每一天,再遍历之后的所有日子寻找卖出的最佳时机。这样可以确保找到每一种可能的利润,并从中选取最大值。使用暴力法求解本题的主要步骤如下。

        1、遍历数组中的每个元素作为买入的候选日。

        2、对于每个买入日,从该日之后继续遍历数组,寻找卖出日,计算潜在的利润。

        3、保存并更新到目前为止找到的最大利润。

        4、遍历结束后,返回最大利润。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def stock_trading_brute_force(prices):if not prices:return 0max_profit = 0for i in range(len(prices)):for j in range(i + 1, len(prices)):profit = prices[j] - prices[i]if profit > max_profit:max_profit = profitreturn max_profitprint(stock_trading_brute_force([7, 1, 5, 3, 6, 4]))

迭代法

        迭代法,也称为循环法,是通过重复执行一段代码块(循环体)来逐步推进问题解决的过程。对于该问题,迭代法的思路非常直观:我们只需要遍历一次股票价格数组,同时追踪到目前为止遇到的最低价格和基于这个最低价格所能获得的最大潜在利润。通过这种方式,我们可以在遍历的过程中实时更新最大利润,最终遍历完成后得到的结果就是最大可获得的利润。使用迭代法求解本题的主要步骤如下。

        1、初始化。设置两个变量,min_price 初始化为数组第一个元素,表示目前观察到的最低股票价格。max_profit 初始化为0,表示目前的最大利润。

        2、遍历数组。从数组的第二个元素开始遍历,直到数组末尾。

        (1)计算潜在利润。对于每个遍历到的股票价格,计算当前价格与min_price的差值,作为潜在的利润。

        (2)更新最低价格。如果当前价格比已知的最低价格还要低,则更新min_price。

        (3)更新最大利润。如果计算出的潜在利润大于当前的max_profit,则更新max_profit为这个更大的利润值。

        3、返回结果。遍历结束后,max_profit即为在整个遍历过程中可以获取的最大利润。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def stock_trading_iteration(prices):min_price = prices[0]max_profit = 0for price in prices[1:]:min_price = min(min_price, price)max_profit = max(max_profit, price - min_price)return max_profitprint(stock_trading_iteration([7, 1, 5, 3, 6, 4]))

总结

        使用暴力法时,外层循环遍历每个元素作为买入日,内层循环则从该日起遍历之后的每个元素作为卖出日,故总的时间复杂度是O(n^2),其中n是数组的长度。

        迭代法只进行了一次遍历,故总的时间复杂度是O(n),其中n是数组的长度。这是一种比较高效的解法,特别是相比于最初的暴力解法,它在处理大数据集时能显著提高效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW平台从离散光子到连续光子的光子计数技术

光子计数技术用于将输入光子数转换为离散脉冲。常见的光子计数器假设光子是离散到达的,记录到来的每一个光子。但是,当两个或多个光子同时到达时,计数器会将其记录为单个脉冲,从而只计数一次。当连续光子到达时,离散光…

python学习-容器类型

列表 列表(list)是一种有序容器,可以向其中添加或删除任意元素. 列表数据类型是一种容器类型,列表中可以存放不同数据类型的值,代码示例如下: 列表中可以实现元素的增、删、改、查。 示例代码如下: 增 …

基于Unity3D的Rokid AR Glass项目开发环境搭建

初识Rokid AR 一、SDK简介二、准备工作1.软件环境2.硬件环境 三、快速接入SDK1.配置Package Manager2.安装UXR2.0 SDK 四、导入官方Demo进行模拟器测试五、Rokid AR系列教程 一、SDK简介 UXR2.0 SDK是Rokid为Unity开发者提供的AR开发工具包,提供空间定位跟踪、双目…

Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)

netsh int ip reset 命令是用于重置 Windows 操作系统中的网络设置和配置的命令。 在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。 命令详解: netsh: 用于配置各种网络设置 int: 用于管理网络接口 ip: 用于管理网络接口的 IP 配…

学习嵌入式对于学历有要求吗?

学习嵌入式系统开发通常并不对学历有严格的要求,尤其是在技术行业中,实际的技能和经验往往比学历更为重要。我收集归类了一份嵌入式学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕…

Swift 中 map 和 flatMap 的区别 (入门版)

在 Swift 中,map 和 flatMap 是用于处理集合类型(如数组、字典、集合等)的两个重要方法。尽管它们看起来相似,但它们在处理集合中的元素和结果时有着不同的行为。 map 方法 map 方法会对集合中的每一个元素应用一个变换&#xff…

Ubuntu 24.04 LTS (Linux) 安装二维码生成工具 QRencode 二维码生成和识别

1 Ubuntu 安装 sudo apt update sudo apt-get install qrencode 2 查看版本 qrencode -V 3 生成二维码 qrencode -o test.png http://www.baidu.com 可以下载test.png图片,用手机浏览器扫描下看(⊙﹏⊙)

FPGA 项目菜单功能比较

为了帮助您更好地理解每个FPGA功能模块的实用场合、区别和特点,以下是详细的比较: 功能模块实用场合区别特点FPGA I/O自动控制系统、数据采集系统直接与FPGA板卡上的物理端口交互,配置和使用外部I/O设备灵活配置输入输出端口,支持…

Day62 单调栈part01

LC739每日温度(未掌握) 暴力解法:两层for循环,时间复杂度O(n^2),会超时未掌握原因分析:只想到了从栈顶到栈底是递减的情况,忽略了从栈顶到栈底是递增的情况 因为需要找到一个元素右边第一个更大元素,只有…

寂静孤独的404页面源码

寂静孤独的404页面源码,灯光闪烁动态效果,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 寂静孤独的404页面源…

【深度学习】PyTorch深度学习笔记01-Overview

参考学习:B站视频【《PyTorch深度学习实践》完结合集】-刘二大人 ------------------------------------------------------------------------------------------------------- 1. 基于规则的深度学习 2. 经典的机器学习——手动提取一些简单的特征 3. 表示学习…

深入理解 LXC (Linux Containers)

目录 引言LXC 的定义LXC 的架构LXC 的工作原理LXC 的应用场景LXC 在 CentOS 上的常见命令实验场景模拟总结 1. 引言 在现代 IT 基础设施中,容器技术已经成为一种重要的应用和部署方式。与虚拟机相比,容器具有更高的效率、更轻量的特性和更快的启动速度…

AI应用观:从“卷模型”到“卷应用”的时代跨越

在2024年世界人工智能大会的舞台上,百度创始人李彦宏的发言如同一股清流,为当前如火如荼的人工智能领域注入了深刻的思考。他提出的“大家不要卷模型,要卷应用”的观点,不仅是对当前AI技术发展趋势的精准洞察,更是对未…

【PB案例学习笔记】-30动态打开窗口

写在前面 这是PB案例学习笔记系列文章的第30篇,该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上传到了gite…

Mosh|内连接、外连接、左连接、右连接(未完)

下图取自菜鸟教程,侵权删~ 一、内连接:Inner Joins 模版:SELECT * FROM A JOIN B ON 条件 含义:返回A与B的交集,列为AB列之和 练习:将order_items表和products表连接,返回产品id和…

【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示 proteus仿真+程序+设计报告+讲解视频

【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示设计 1.主要功能:讲解视频:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接: 【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示设计 ( proteus仿真…

Androidstudio开发,天气预报APP

1.项目功能思维导图 2. 项目涉及到的技术点 数据来源:和风天气API使用okhttp网络请求框架获取api数据使用gson库解析json数据使用RecyclerViewadapter实现未来7天列表展示和天气指数使用PopupMenu 实现弹出选项框使用动画定时器实现欢迎页倒计时和logo动画使用Text…

web 网络安全

Web网络安全是网络安全的一个重要分支,专注于保护Web应用程序、服务和网站免受各种网络威胁。学习Web网络安全涉及多个层面的知识和技能,以下是一些主要的学习领域: 一、XSS攻击 全称::Cross Site Script (跨站脚本&a…

在vue3中,手写父子关联,勾选子级父级关联,取消只取消当前子级,父节点不动

树形控件选择子级勾选父级,以及所有子级, 取消勾选仅取消子级 在项目中,可能会遇到这种场景,比如权限配置的时候,页面权限和菜单权限以tree的形式来配置,而且不用半选,菜单在页面的下面&#xf…

FTP与TFTP

1、TFTP(简单文件传输协议) TFTP是TCP/IP协议族中一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。 基于UDP协议 端口号:69 特点:简单、轻量级、易于实现 传输过程&…