leetcode刷题:买卖股票的最佳时机

题目

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

解题思路

先考虑最简单的「暴力遍历」,即枚举出所有情况,并从中选择最大利润。设数组 prices 的长度为 n ,由于只能先买入后卖出,因此第 1 天买可在未来 n−1 天卖出,第 2 天买可在未来 n−2天卖出……以此类推,共有 (n−1)+(n−2)+⋯+0=n(n-1)/2种情况,时间复杂度为 O( N 2 N^2 N2)
) 。考虑到题目给定的长度范围 1≤prices.length≤ 1 0 5 10^5 105,需要思考更优解法。

因为,暴力法会产生许多冗余计算。例如,若第 1 天价格低于第 2 天价格,即第 1 天成本更低,那么我们一定不会选择在第 2 天买入。进一步的,若在前 i天选择买入,若想达到最高利润,则一定选择价格最低的交易日买入。考虑根据此贪心思想,遍历价格列表 prices 并执行两步:

由于初始值 i=0 ,为了序号对应,本文设从第 0 天开始;

  1. 更新前 i天的最低价格,即最低买入成本 cost
  2. 更新前 i天的最高利润 profit ,即选择「前 i−1天最高利润 profit 」和「第 i 天卖出的最高利润 price - cost 」中的最大值。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
class Solution {public int maxProfit(int[] prices) {int cost = Integer.MAX_VALUE, profit = 0;for (int price : prices) {cost = Math.min(cost, price);profit = Math.max(profit, price - cost);}return profit;}
}

复杂度分析

  • 时间复杂度 O( N N N) : 其中 N 为数组 prices 长度。遍历 prices 使用线性时间。
  • 空间复杂度 O( 1 1 1) : 变量 cost , profit 使用 O( 1 1 1) 空间。

关于动态规划

动态规划(Dynamic Programming,简称 DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。动态规划方法的基本思想是:将待求解的问题分解成若干个相互重叠的子问题,求解一个子问题时,将其解存储起来,以便以后利用。这样,在求解任何一个子问题时,所利用的子问题的解都是已经计算过的,从而避免了重复计算。

以下是动态规划的一些基本步骤:

  1. 描述最优解的结构:如果问题的最优解包含了其子问题的最优解,则称该问题具有最优子结构性质。动态规划利用这一性质,通过求解子问题的最优解来构造原问题的最优解。
  2. 定义状态:状态就是原问题和子问题的解。状态必须能够表示出与原问题相关的所有信息,从而能够推导出子问题的解。
  3. 状态转移方程:状态转移方程就是描述状态之间关系的方程。它表示了如何从子问题的最优解推导出原问题的最优解。
  4. 计算最优解:按照状态转移方程,从子问题的最优解开始,逐步推导出原问题的最优解。

下面是一个经典的动态规划问题——背包问题的例子:

给定一组物品,每种物品都有自己的重量和价值。在限定的总重量内,我们如何选择,才能使得物品的总价值最高。这就是一个典型的背包问题。我们可以使用动态规划来解决这个问题。首先,我们定义状态 dp[i][j] 表示在前 i 个物品中,选择总重量不超过 j 的物品,能够得到的最大价值。然后,我们可以得到状态转移方程:

  • 如果第 i 个物品的重量大于 j,那么 dp[i][j] = dp[i-1][j],即前 i 个物品的最大价值等于前 i-1 个物品的最大价值(因为第 i 个物品太重,无法放入背包)。
  • 否则,dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])。这里有两种选择:要么不选第 i 个物品,此时最大价值为 dp[i-1][j];要么选择第 i 个物品,此时最大价值为前 i-1 个物品在总重量不超过 j-weight[i] 的情况下的最大价值加上第 i 个物品的价值。

最后,我们遍历所有状态,计算出 dp[n][W],其中 n 是物品的数量,W 是背包的总重量限制,即为问题的解。

这只是动态规划的一个简单应用。实际上,动态规划可以应用于各种领域,如生物信息学、图像处理、机器学习等,是解决复杂问题的一种强大工具。

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

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

相关文章

Java基于Geth1.8实现节点同步、合约部署,以及踩坑记录—主节点控制台卡死、节点同步出错的解决方案

前言&#xff1a;本文将从一个区块链入门小白的视角&#xff0c;来一步步的讲解如何实现区块链数据上链&#xff0c;链上数据查询&#xff0c;geth多节点同步。以及讲解在上链过程中&#xff0c;我踩过的坑及其解决方案。如果有不对的地方&#xff0c;还请大佬指教&#xff01;…

2023愚人杯 )————被遗忘的反序列化

<?php# 当前目录中有一个txt文件哦 error_reporting(0); show_source(__FILE__); include("check.php");class EeE{public $text;public $eeee;public function __wakeup(){if ($this->text "aaaa"){echo lcfirst($this->text);}}public functi…

基于SSM+Vue的物流管理系统

运行截图 获取方式 Gitee仓库

用迭代加深解决加成序列问题

可以看到这个最坏的结果是100层搜索&#xff0c;但是其实1 2 4 8 16 32 64 128&#xff0c;到128的话也只要8&#xff0c;所以大概只需要10几层搜索就可以解决了&#xff0c;这个时候就可以用迭代加深的方法&#xff0c;深度一点点的加&#xff0c;如果大于概深度就舍去。有人说…

解决vue3项目打包后部署后某些静态资源图片不加载问题

目录 问题 原因 解决方案 问题 开发完项目打包并部署 然后访问时发现导航栏背景图片没加载 打开浏览器控制台发现这张图片报错404 原因 可能是因为在部署后的服务器环境中对中文文件名的支持不完善。服务器在解析 URL 时可能无法正确识别或编码中文字符&#xff0c;导致无…

实现stract(字符串拼接)函数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;char a[80], b[80];int i, n1, n2;//填充字符串&#xff1b;printf("请输入字符串a的内…

Shell编程之循环语句之for

一.for循环语句 读取不同的变量值&#xff0c;用来逐个执行同一组命令 for 变量名 in 取值列表 do命令序列 done 示例&#xff1a; 1.计算从1到100所有整数的和 2.提示用户输入一个小于100的整数&#xff0c;并计算从1到该数之间所有整数的和 3.求从1到100所有整数的偶数和…

【计算机网络】计算机网络体系结构

&#x1f6a9;本文已收录至专栏&#xff1a;计算机网络学习之旅 一.常见的三种结构 (1) OSI参考模型 为了使不同体系结构的计算机网络都能互连起来&#xff0c;国际标准化组织于1977年成立了专门机构研究该问题&#xff0c;提出了著名的开放系统互连基本参考模型&#xff0c…

若依-生成主子表

1. sql语句建表导入到数据库中&#xff1a; -- ---------------------------- -- Table structure for t_ques————主表 -- ----------------------------CREATE TABLE ques (ques_id INT NOT NULL AUTO_INCREMENT COMMENT Id,name VARCHAR(255) NOT NULL COMMENT 测评名称…

IB 公式解析

公式 3.2. Influence Function 影响函数允许我们在移除样本时估计模型参数的变化&#xff0c;而无需实际移除数据并重新训练模型。 3.3 影响平衡加权因子 3.4 影响平衡损失 3.5 类内重加权 m代表一个批次&#xff08;batch&#xff09;的大小&#xff0c;这意味着公式对一个批…

【Dash】开始学习dash

安装Dash 网上很多安装dash的教程&#xff0c;不再赘述 开始Dash 一个dash页面的基本写法 # dash 的基本写法 import dash from dash import html,dcc,callback,Input,Output# 创建一个 dash 应用 app dash.Dash()# 定义布局&#xff0c;定义一个输入框和一个输出框 app.l…

电商技术揭秘营销相关系列文章合集(4)

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 文章目录 引言集合说明集合文章列表 引言 在数字化浪潮的推动下&#xff0c;电商行…

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中&#xff0c;消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列&#xff08;Message Queue&#xff09;&#xff1a; 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时&#xff0c;系统会将生成的消息插入到消息队列中&…

手游掘金最新玩法,单条视频变现1w+,一部手机即可操作,保姆级教程

如果你也想通过手机赚钱&#xff0c;在这里有一个非常好的项目&#xff0c;它可以让你轻松赚到额外的收入。 这个手游掘金最新玩法&#xff0c;是一个非常受欢迎的项目&#xff0c;它可以让你通过制作单条视频来获得高额收益。不同于传统的游戏赚钱方式&#xff0c;这个方法不…

哈希(构造哈希函数)

哈希 哈希也可以叫散列 画一个哈希表 哈希冲突越多&#xff0c;哈希表效率越低。 闭散列开放定址法: 1.线性探测&#xff0c;依次往后去找下一个空位置。 2.二次探测&#xff0c;按2次方往后找空位置。 #pragma once #include<vector> #include<iostream> #i…

告别数据泥潭:PySpark性能调优的黄金法则

阿佑今天给大家带来个一张藏宝图——使用PySpark进行性能调优的黄金法则&#xff0c;从内存管理到执行计划&#xff0c;再到并行度设置&#xff0c;每一步都是提升数据处理速度的关键&#xff01; 文章目录 Python Spark 详解1. 引言2. 背景介绍2.1 大数据处理技术演变2.2 Apac…

【MySQL】SQL基本知识点DML(2)

目录 1.DML添加数据 2.DML-修改数据 &#xff08;1&#xff09;改​编辑 &#xff08;2&#xff09;删​编辑​编辑 3.DQL-基本查询 &#xff08;1&#xff09;查询多个字段​编辑​编辑​编辑 &#xff08;2&#xff09;设置别名 &#xff08;3&#xff09;去重操作 4…

月内录用,这本期刊不到2个月完成检索

无预警毕业/晋升快刊&#xff0c;该期刊2008年被WOS收录&#xff0c;现已稳定检索16年&#xff0c;进展超顺。注意&#xff01;该期刊仅剩10篇版面&#xff01;咨询Aaron编辑老师了解该刊更多信息&#xff01; 1、期刊基本信息 【期刊简介】IF&#xff1a;0-1.0&#xff0c;J…

【SpringBoot】 什么是springboot(三)?springboot使用ajax、springboot使用reids

文章目录 SpringBoot第五章第六章1、springboot使用ajax2、springboot使用reids1、单机版**使用步骤**1-5步67-9步RedisTemplate使用RedisTemplate2、集群版开启集群项目配置1234-5第七章1、springboot文件上传使用步骤1-234-52、springboot邮件发送步骤1-23453、springboot拦截…

全球首例!猪肾移植患者死亡,人类科技与伦理或将面临挑战?

全球首例猪肾移植患者的离世&#xff0c;如同一颗重磅炸弹&#xff0c;在医学界激起千层浪花&#xff0c;让原本充满希望的“死而复生”异种器官移植技术再次被推至风口浪尖。 今年3月&#xff0c;一场与命运的较量在麻省总医院悄然落幕。全球首位接受转基因猪肾移植的患者理查…