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://xiahunao.cn/news/3225402.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

内网对抗-基石框架篇单域架构域内应用控制成员组成用户策略信息收集环境搭建

知识点: 1、基石框架篇-单域架构-权限控制-用户和网络 2、基石框架篇-单域架构-环境搭建-准备和加入 3、基石框架篇-单域架构-信息收集-手工和工具1、工作组(局域网) 将不同的计算机按照功能分别列入不同的工作组。想要访问某个部门的资源,只要在“网络…

如何在 C 语言中进行选择排序?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。 文章目…

2024浙江外国语学院汉语桥线上项目 “在杭州,看见更好的中国”开班

7月9日上午,由教育部中外语言交流合作中心主办、浙江外国语学院国际商学院承办的2024汉语桥“在杭州,看见更好的中国”线上项目正式启动。项目负责人何骅老师及汉语桥教师团队,与来自越南、缅甸、日本、俄罗斯的100名学员相聚云端&#xff0c…

【安全设备】Web应用防火墙

一、什么是Web应用防火墙 Web应用程序防火墙(Web Application Firewall)的缩写是WAF,用于保护Web应用程序免受各种恶意攻击和漏洞利用。WAF通过监控和过滤进出Web应用程序的HTTP/HTTPS流量来工作。它位于Web应用程序和用户之间,分…

完美解决windows开机时,系统提示此windows副本不是正版的正确解决方法,亲测有效!!!

完美解决windows开机时,系统提示此windows副本不是正版的正确解决方法,亲测有效!!! 亲测有效 完美解决windows开机时,系统提示此windows副本不是正版的正确解决方法,亲测有效!&#…

09-《悬铃花》

悬 铃 花 悬铃花,拉丁学名(Malvaviscus arboreus Cav.),属常绿小灌木。外型略似朱槿,高30-60cm,鲜红色花朵,较为奇特,花期终年、花量多。悬铃花性强健,喜高温多湿和阳光充…

Mac电脑利用 IDEA自带 Maven配置环境变量

平常也是用 IDEA,有些配置环境变量总要我安装Maven,但是 IDEA 自己已经有了 Maven,但是没有环境变量,能否配置呢?答案是 ok 的。 目录 为什么需要配置环境变量常规配置Maven环境变量下载和安装Maven配置MAVEN_HOME和…

处理和执行外部命令subprocess.run()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 处理和执行外部命令 subprocess.run() [太阳]选择题 subprocess.run()的返回值中,哪个属性表示执行是否成功? import subprocess res subprocess.run([python, hell…

【代码随想录】【算法训练营】【第63天】 [卡码53]寻宝

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 63,周二,ding~ 题目详情 [卡码53] 寻宝 题目描述 卡码53 寻宝 解题思路 前提: 思路: 重点: 代码实现 C语言 prim算法 kruskal…

枚举类 (enum)

目录 一、为什么要有枚举类? 二、枚举的简介 三、自定义枚举类 四、使用enum关键字 五、注意事项 一、为什么要有枚举类? 假如我们有这样的一个需求:设计季节类,并创建对象。 我们就需要以下操作,创建Season类&…

基于vue的地图特效(飞线和标注)

这段代码的主要功能是在页面加载完成后,初始化一个 echarts 地图图表,并配置了相关的地理数据、散点数据、线条数据以及样式效果,最后在指定的 div 元素中进行展示。 需要再vue中的框架实现,不能单独直接运行。 标注 type: effe…

案例|180套设备24小时监测,守护某油气管线安全

油气管道跨越工程是我国重要的能源基础设施,也是油气上下游衔接协调发展的关键环节,还是我国现代能源体系和现代综合交通运输体系的重要组成部分。守护能源安全大动脉,筑牢油气管网基础设施安全具有重要意义。 一、项目背景 某油气管线是我国…

802.11漫游流程简单解析与笔记_Part2_05_wpa_supplicant如何通过nl80211控制内核开始关联

最近在进行和802.11漫游有关的工作,需要对wpa_supplicant认证流程和漫游过程有更多的了解,所以通过阅读论文等方式,记录整理漫游相关知识。Part1将记录802.11漫游的基本流程、802.11R的基本流程、与认证和漫游都有关的三层秘钥基础。Part1将包…

如何计算多路复用器的建立时间和采样速率

简介 计算开关或多路复用器建立时间的基本方法是计算器件的RC(即,Ron * Cd),并乘以所需系统精度的时间常数数量,再加上开关或多路复用器的开关定时Ton、Toff或Ttransition。 建立时间 开关定时 (Ron * CD * 时间常数数量) 其中&#xff1a…

Centos7 被停用!如何利用 Ora2Pg 将 Oracle 迁移至 IvorySQL?

在过去的社区讨论中,想要使用或正在使用IvorySQL的社区用户,经常问到Oracle 如何迁移到 IvorySQL 中,而且近期随着 Centos7 官方已经停止维护,这一变动促使了很多将 Oracle 部署在 Centos7 上的 Oracle 用户,开始准备 …

习题练习以

题意:求i&M的popcount的和,i属于0……N 主要思路还是变加为乘。 举个例子N22,即10110 假设M的第3位是1,分析N中: 00110 00111 00100 00101 发现其实等价于 0010 0011 0000 0001 也就是左边第4位和第5…

qt 用数据画一个图,并表示出来

1.概要 想用数据绘制一个画面,看有相机到播放的本质是啥。 要点 // 创建一个QImage对象,指定图像的宽度、高度和格式 QImage image(width, height, QImage::Format_Grayscale8); // 将像素数据复制到QImage对象中 memcpy(image.bits(), pixelD…

项目进度计划、软件部署、调试方案

项目进度计划 项目计划工期:合计3000日历天完成整体项目交付。 软件部署 办公管理系统是一项复杂、长期的系统工程,为保证业务系统能够顺利地进行实施,必须要制定科学、合理、切实可行的实施计划。一方面要从组织上进行落实,成立强有力的项目领导小组和经验丰富的项目实…

实用教程:用 Go 的 net/textproto 包优化文本协议处理

实用教程:用 Go 的 net/textproto 包优化文本协议处理 介绍准备工作环境设置Go 基础回顾 基础使用创建连接发送请求接收响应 高级特性处理 MIME 头多行响应的管理错误处理与调试 实战案例实现一个简单的邮件客户端实现一个基于 net/textproto 的命令行工具 最佳实践…

【微服务】Spring Cloud中如何使用Eureka

文章目录 强烈推荐引言主要功能Eureka 的架构使用示例Eureka Server 配置Eureka Client 配置示例服务服务发现调用示例 Spring Cloud如何实现服务的注册?1. 搭建 Eureka 服务注册中心2. 配置服务注册到 Eureka3. 验证服务注册 总结应用场景1. 动态服务发现2. 负载均衡3. 服务治…