LeetCode121 买卖股票的最佳时机 遍历法和动态规划

news2024/11/25 0:59:25

题目地址:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/

给定一个数组 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 <= 10^5
0 <= prices[i] <= 10^4

方法一:暴力法

需要找出给定数组中两个数字之间的最大差值(即,最大利润)。
此外,第二个数字(卖出价格)必须大于第一个数字(买入价格)。

public class Solution {
    public int maxProfit(int[] prices) {
        int maxprofit = 0;
        for (int i = 0; i < prices.length - 1; i++) {
            for (int j = i + 1; j < prices.length; j++) {
                int profit = prices[j] - prices[i];
                if (profit > maxprofit) {
                    maxprofit = profit;
                }
            }
        }
        return maxprofit;
    }
}

复杂度分析:

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

方法二 动态规划

假如计划在第 i 天卖出股票,那么最大利润的差值一定是在[0, i-1] 之间选最低点买入;所以遍历数组,依次求每个卖出时机的的最大差值,再从中取最大值。

dp[i]表示截止到i,价格的最低点是多少。

考虑每次如何获取最大收益?第 i 天的最大收益等于第 i 天的价格减 [0, i-1] 天的最低价格。而最低价格取决于第 i 天和前 i-1天谁更低,至此我们的转移方程就出来了。

dp[i] = min(d[i-1], prices[i])

其中 dp[0]=prices[0],然后动态计算之后的就可以了。 得到了前i天的最低点以后,只需要维护一个max用来保存最大收益就可以了。

这个时候是空间复杂度O(n)的动态规划,代码如下

//dp[i]表示截止到i,价格的最低点是多少   dp[i]=min(dp[i-1],nums[i])
        int max = 0;
        int[] dp = new int[prices.length];
        dp[0] = prices[0];
        for (int i = 1; i < prices.length; i++) {
            dp[i] = (dp[i - 1] < prices[i]) ? dp[i - 1] : prices[i];
            max = (prices[i] - dp[i]) > max ? prices[i] - dp[i] : max;
        }
        return max;

接着考虑优化空间

仔细观察动态规划的辅助数组,其每一次只用到了 dp[i-1] 这一个空间,因此可以把数组改成单个变量 minPrice 来存储截止到第 i 天的价格最低点,得到最终解法:

public class Solution {
    public int maxProfit(int prices[]) {
        int minPrice = Integer.MAX_VALUE, maxProfit = 0;
        for (int i = 0; i < prices.length; i++) {
            if (prices[i] < minPrice) {
                minPrice = prices[i];
            }
            else if (i > 0) {
                int profit = prices[i] - minPrice;
                if (profit > maxProfit) {
                    maxProfit = profit;
                }
            }
        }
        return maxProfit;
    }
}

复杂度分析:

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

在这里插入图片描述

本文完,希望对你有帮助。

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

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

相关文章

Python爬虫之MongoDB

目录 一、Mongo概述 二、安装&下载 1.下载&#xff1a; 2.安装 三、基本命令 插⼊数据 查询数据 修改数据 删除数据 索引 四、Python与MongoDB交互 1.安装pymongo 2.使⽤ 一、Mongo概述 MongoDB是什么&#xff1f; MongoDB是⾮关系型数据库(No sql) 为啥需要…

无线传感网络课程作业 1-dijkstra算法计算最短路径并输出经过的节点

无线传感网络课程作业 1 仅供参考-如有需要可订阅专栏 题目有如下网络图: abc三个数以a=3,b=1,c=1为例 运行环境:anaconda3环境管理工具,Python 3.9.12,Windows 10 22H2算法实现原理流程i).

Java——二叉搜索树的后序遍历序列

题目链接 牛客在线oj题——二叉搜索树的后序遍历序列 题目描述 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。 数据范围&#xff1a; 节点数量 0≤n≤1000 …

PLECS的基本介绍

PLECS的基本介绍 一&#xff1a;PLECS的基本介绍简单说明二&#xff1a;多功能的辅助工具三&#xff1a;主要功能介绍1、独特的热分析功能2、功能强大的示波器3、极快的仿真速度4、强大的波形分析工具5、C 语言控制器6、丰富的元件库 一&#xff1a;PLECS的基本介绍简单说明 1&…

QMS-云质说质量 - 7 IATF 16949哪个条款严重不符合项最多?

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 引言 AIAG 《质量2020》报告的数据是否让你惊讶&#xff1f; AIAG与德勤合作发布的汽车行业《质量2020》报告指出&#xff0c;"OEMs和供应商都将问题解决和CSR&#xff08;Customer Specific Requirement顾客特定要求…

What...MiniGPT-4居然开源了,提前感受 GPT-4 的图像对话能力

说在前面的话&#xff1a; 一个月前&#xff0c;OpenAI向外界展示了GPT-4如何通过手绘草图直接生成网站&#xff0c;令当时的观众瞠目结舌。 在GPT-4发布会之后&#xff0c;相信大家对ChatGPT的对话能力已有所了解。圈内的朋友们应该已经亲身体验过无论是文本生成、编写代码&…

涨点技巧:基于Yolov5/Yolov7的困难样本挖掘---LRM loss,提升难样本检测精度

1.hard example mining(困难样本挖掘)✨✨✨ 困难例挖掘方法通常可以提高目标检测器的性能,因为它受到不平衡训练集的影响。为了通过RoI正确地挖掘困难例,引入了在线困难例挖掘(OHEM)方法[15]。该方法建议只考虑对反向传播最有利的RoI。给出最高损失值的RoI被认为是最难的…

【汽车品牌案例 Objective-C语言】

一、刚才,我给大家说了一下这个单元格的重用,接下来,我给大家再做一个案例, 1.再做一个什么案例呢,还是显示那个汽车品牌, 咱们上午是不是做过一个那个汽车品牌的展示了,做过那个展示,那是简单的一个展示,咱们再做一个,使用另外一个不同的一个plist文件,car_total.…

必应,百度,神马头条,搜狗专用站长seo推送工具大全

软件介绍&#xff1a; 百度开始打击滥用api问题&#xff0c;针对这个问题已经开发了拟人推送系列功能&#xff0c;放心使用。 五合一高效推送软件&#xff0c;目前支持百度&#xff0c;神马&#xff0c;必应&#xff0c;搜狗&#xff0c;头条&#xff0c;谷歌六大搜索引擎同步…

setup,ref,reactive

初识setup 1.理解:Vue3.0中一个新的配置项&#xff0c;值为一个函数。 2.setup是所有Composition API(组合API)“表演的舞台”。 3.组件中所用到的:数据、方法等等&#xff0c;均要配置在setup中。 4.setup函数的两种返回值: 1.若返回一个对象&#xff0c;则对象中的属性、…

IDEA(七) 使用UML类图

目录 1.相关快捷键1.1 查看快捷键1.2 其他快捷键1.3 分析类图1.4 定制展示类中的内容1.5 适配窗口和1:1展示1.6 定制布局1.7 其他设置 1.相关快捷键 1.1 查看快捷键 Ctrl Alt U &#xff1a;以弹窗的形式查看UML类图。Ctrl Shift Alt U &#xff1a;以标签的形式查看UML…

C learning_9 (函数篇)

目录 函数 函数的概念 函数的作用 函数的分类 函数的参数 函数的调用 函数 函数的概念 概念&#xff1a;C语言中的函数是一种封装了一定功能的代码块&#xff0c;可以在程序的任意位置调用。 返回值类型 函数名(参数列表) { 函数体 return 返回值; } 1.返回值类型指定了…

Vue的路由实现:hash模式 和 history模式原理及区别

目录标题 1、hash模式2、history模式 Vue-Router有两种模式: ** hash 模式和 history**模式。默认的路由模式是hash模式。 1、hash模式 简介&#xff1a;hash模式是开发中默认的模式&#xff0c;它的URL带着一个#&#xff0c;例如:http://www.abc.com/#/vue&#xff0c;它的…

从广交会,看懂海尔智家逆势增长的秘密

中国企业的全球化战略应从何处、以何种方式推进&#xff1f;作为行业全球化最彻底的企业&#xff0c;海尔智家是个很好的参考。 4月15日&#xff0c;在第133届中国进出口贸易交易会&#xff08;以下简称“广交会”&#xff09;上&#xff0c;海尔智家展示了其扎根本土&#xf…

Learning Dynamic Facial Radiance Fields for Few-Shot Talking Head Synthesis 笔记

Learning Dynamic Facial Radiance Fields for Few-Shot Talking Head Synthesis 笔记 摘要 Talking head synthesis is an emerging technology with wide applications in film dubbing, virtual avatars and online education. Recent NeRF-based methods generate more n…

举个栗子~Tableau 技巧(253):让筛选器只显示全部以及需要的类别

用户反馈了一个需求&#xff1a;我的业务数据有很多类别&#xff0c;但其实经常查看的只有几个&#xff0c;Tableau 筛选器能不能设置一下&#xff0c;只显示全部和经常查看的那几个类别&#xff1f; 这个是可以实现的&#xff01;如下示例&#xff0c;数据类别有&#xff1a;…

好用的思维导图软件有哪些

ProcessOn &#xff0c;一款让“工具回归工具、让你回归你的"软件&#xff01; 当“在线”成为当今时代的主流时、 如果让你选择一款好用的思维导图软件、 你希望Ta 是什么样的&#xff1f; ProcessOn&#xff01; 它可以是你的待办清单、笔记工具、社区分享工具、PPT演…

vector(入门知识点)

目录 vector的介绍 ​编辑 例&#xff1a;遍历 拷贝&#xff1a; 初始化&#xff1a; 反向迭代器&#xff1a; 扩容&#xff1a; insert与erase vector的介绍 例&#xff1a;遍历 拷贝&#xff1a; 初始化&#xff1a; &#xff08;10个1&#xff09; vector<int>注意…

Jetpack Compose 中使用分页 API 调用的无限滚动

Jetpack Compose 中使用分页 API 调用的无限滚动 最近&#xff0c;我在DashCoin 的硬币屏幕上添加了一个带有分页 API 调用的无限滚动。它使浏览硬币列表变得非常困难&#xff0c;并且确实减少了初始加载时间&#xff0c;比以前少了。如果没有正确实施&#xff0c;实施无限滚动…

基数排序详解

本期内容是对之前排序内容的一部分补充&#xff0c;需要有一定的基础 (14条消息) 万字解析&#xff0c;带你深入掌握多种排序算法&#xff01;-C语言-CSDN博客 基数排序 基数排序&#xff08;Radix Sorting&#xff09;是和前面所述各类排序方法完全不相同的一种排序方法。从…