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

news2024/9/30 19:39:25

题目

        给定一个整型数组,它的第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 0
    
    max_profit = 0
    for i in range(len(prices)):
        for j in range(i + 1, len(prices)):
            profit = prices[j] - prices[i]
            if profit > max_profit:
                max_profit = profit
                
    return max_profit

print(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 = 0

    for price in prices[1:]:
        min_price = min(min_price, price)
        max_profit = max(max_profit, price - min_price)
    
    return max_profit

print(stock_trading_iteration([7, 1, 5, 3, 6, 4]))

总结

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

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

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

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

相关文章

前端面试题36(js栈和堆)

在JavaScript中,内存管理是自动进行的,主要通过栈(stack)和堆(heap)两种方式来分配和管理内存。理解这两者对于深入学习JavaScript以及优化代码性能非常关键。 栈 (Stack) 栈是一种后进先出(Last In, First Out, LIFO)的数据结构…

U盘启动快捷键查询

电脑开机一般默认自身硬盘启动系统,如需要U盘重装系统,开机时一直按对应机型的U盘启动快捷键,选择对应USB设备即可U盘启动。 一、品牌台式 二、品牌笔记本 三、组装电脑

Go语言---Json

JSON (JavaScript Object Notation)是一种比XML 更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成。尽管JSON是 JavaScript的一个子集,但 JSON采用完全独立于编程语言的文本格式,且表现为键/值对集合的文…

红日靶场----(三)漏洞利用

上期已经信息收集阶段已经完成,接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/(数据库的管理界面) root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

深入探索大语言模型

深入探索大语言模型 引言 大语言模型(LLM)是现代人工智能领域中最为重要的突破之一。这些模型在自然语言处理(NLP)任务中展示了惊人的能力,从文本生成到问答系统,无所不包。本文将从多个角度全面介绍大语…

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

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

OR-3H7-4晶体管光耦,可对标替代TLP281-4等

提供隔离反馈 逻辑电路之间的接口 提供1通道和4通道 电平转换 DC和AC输入 SMPS中的调节反馈电路 消除接地环路 特征 电流传输比:IF 1mA,VCE 5V,Ta 25 C时最小50% 高输入输出隔离电压。(VISO3,750Vrms&#xf…

基于Java中的SSM框架实现暖心家装平台系统项目【项目源码+论文说明】

基于Java中的SSM框架实现暖心家装平台系统演示 摘要 自从互联网技术得到大规模的应用以后,传统家装企业面临全新的竞争激烈的市场环境。要想占得当前家装营销与管理的先机,除了要加强内部管理,提高企业内部运营效率,更要积极推进…

【漏洞复现】时空智友ERP——uploadStudioFile——任意文件上传

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 时空智友ERP是专为医药等行业设计的综合性企业资源规划系统&…

Camera Raw:蒙版 - 蒙版叠加

Camera Raw “蒙版”模块中的蒙版叠加 Calibration功能可以帮助用户在调整照片时更好地可视化和管理所选区域,提高照片局部处理过程中的效率。 ◆ ◆ ◆ 使用方法与技巧 1、自动切换叠加 默认情况下启用“自动切换叠加”选项,这样可以使得在绘制蒙版时…

谷粒商城学习笔记-23-分布式组件-SpringCloud Alibaba-Nacos配置中心-简单示例

之前已经学习了使用Nacos作为注册中心,这一节学习Nacos另外一个核心功能:配置中心。 一,Nacos配置中心简介 Nacos是一个易于使用的平台,用于动态服务发现和配置管理。作为配置中心,Nacos提供了以下核心功能和优势&am…

全终端自动化测试框架wyTest

突然有一些觉悟,程序猿不能只会吭哧吭哧的低头做事,应该学会怎么去展示自己,怎么去宣传自己,怎么把自己想做的事表述清楚。 于是,这两天一直在整理自己的作品,也为接下来的找工作多做点准备。接下来…

详细分析Spring中的@Configuration注解基本知识(附Demo)

目录 前言1. 基本知识2. 详细分析3. Demo3.1 简单Bean配置3.2 属性配置3.3 多条件配置 4. 实战拓展 前言 Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)Spring框架从入门到学精(全&am…

2-1静态库

静态库制作 编写库文件 test.c #include<stdio.h> int main(void){printf("%d\n",add(3,5));return 0; }add.c int add(int a,int b){return ab; }生成.o(目标文件) 用nm查看.o文件 T代表add这个函数的链接性是外部链接&#xff0c;即全局可见&#xff0c;…

03_Shell变量

【Shell】03_Shell变量 一、环境变量 Linux系统配置文件&#xff08;全局配置文件和用户个人配置文件&#xff09;中定义的变量&#xff0c;提供给所有Shell程序使用 1.1、全局环境变量 1.1.1、配置文件位置 /etc/environment /etc/bashrc&#xff08;或者/etc/bash.bashrc…

tensorflow张量生成以及常用函数

张量tensor&#xff1a;多维数组&#xff08;列表&#xff09; 阶&#xff1a;张量的维数 维数 阶 名字 例子 0-D 0 标量 scalar s 1&#xff0c; 2&#xff0c; 3 1-D 1 向量 vector…

Mac VSCode 突然闪退、崩溃、打不开了

1、 思路历程 VSCode 作为前端常用开发工具&#xff0c;其重要性就不一一描述了。 所以 VSCode 突然打不开了&#xff0c;真的是让我一脸懵逼。 本来以为问题不大&#xff0c;于是 &#xff1a; 1、重启了一下VSCode 2、关机重启了一下电脑&#xff1b; 3、清理了一下缓存&am…

阈值分割后配合Connection算子和箭头工具快速知道区域的ID并选择指定区域

代码 dev_close_window () read_image (Image, E:/机器视觉学习/海康视觉平台/二期VM视觉学习/二期VM视觉学习/机器视觉程序/标定相机找圆心和焊头修正相机找圆心之算法软件/标定相机找圆心和焊头修正相机找圆心之算法软件/03 标定相机找圆心/S2/1号机/1.bmp) get_image_size …

Ensp配置防火墙的web界面

Ensp配置防火墙的web界面 准备工作新建网卡配置网卡 启动防火墙配置防火墙注意事项和错误如果云里面没有网卡选项防火墙启动不了没有web界面启动不了没有web界面 准备工作 新建网卡 我用的是win10系统&#xff0c;新建网卡 先右键管理 再点击设备管理器 --- 再网络适配器 接…

【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …