C国演义 [第八章]

news2024/11/23 9:09:26

第八章

  • 买卖股票的最佳时机
    • 题目理解
    • 步骤
      • dp含义
      • 递推公式
      • 初始化
      • 遍历方向
    • 代码
  • 买卖股票的最佳时机II
    • 题目理解
    • 步骤
      • dp含义
      • 递推公式
      • 初始化
      • 遍历方向
    • 代码

买卖股票的最佳时机

力扣链接

给定一个数组 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 <= 105
    0 <= prices[i] <= 104

题目理解

此题一看依旧是 动态规划的经典题目
确定好使用 动态规划的方法, 那么我们就想一下一个问题: 是一维的还是二维的?

每一天的状态是有变化的, 有可能是持有股票的, 也有可能是不持有股票的
每一天的状态有哪几种:

  1. 第 i 天持有股票
  2. 第 i 天不持有股票

那我们能用一维的来表示第 i 天持有股票的情况吗?
答案是 No, No
⇒ 所以, 我们要用一个二维的dp数组

步骤

dp含义

dp[i][0] — — 第 i 天不持有股票获取的最大利润
dp[i][1] — — 第 i 天持有股票获取的最大利润

  • 我们该怎样 理解 持有/非持有?
    如果第 i 天持有股票 — — 有可能前几天就已经购买过, 也有可能是第 i 天才购买
    如果第 i 天不持有股票 — — 有可能一直没买过股票, 也有可能第 i 天才卖出股票

递推公式

根据前面的 持有/非持有 的理解, 那么状态应该怎么转移呢?

dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + price[i]);
dp[i][1] = max(dp[i - 1][1], - price[i]);

初始化

我们通过递推公式发现: 第 i 天的状态是通过 di i - 1天的状态来推导的
⇒ 开始的时候就是 dp[0][0] 和 dp[0][1]
dp[0][0] — — 第 1 天不持有股票的最大利润 — — 第 1 天的钱包是0 — — dp[0][0] = 0;
dp[0][1] — — 第 1 天持有股票的最大利润 — — 第 1 天钱包是0, 就已经买了商品 — — dp[0][1] = -price[0];

遍历方向

通过递推公式发现: 第 i 天的状态是通过 di i - 1天的状态来推导的
⇒ 所以, 遍历方向是 从前向后的

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) 
    {
        int len = prices.size();
        
        // 这里设置2 -- -- 因为就只有两个状态
        vector<vector<int>> dp(len, vector<int>(2)); 
        
        dp[0][0] = 0; // 非持有
        dp[0][1] = -prices[0]; // 持有
        for(int i = 1; i < len; i++)
        {
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]);
            dp[i][1] = max(dp[i-1][1], -prices[i]);
        }
        
        return dp[len-1][0];
        // 可以是返回两者之间的最大值, 但是一定是飞持有的最大价值 > 持有的最大价值
        // 因为: 非持有代表着卖出去了, 是+prices[i]; 而持有代表着买了没没卖出去, 是-prices[i]
    }
};

买卖股票的最佳时机II

力扣链接

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售

返回 你能获得的 最大 利润

示例 1:
输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3
总利润为 4 + 3 = 7

示例 2:
输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4
总利润为 4

示例 3:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。

  • 提示:
    1 <= prices.length <= 3 * 104
    0 <= prices[i] <= 104

题目理解

这个题目跟上面的题目很相似, 但是有一点不同:
本题股票可以买卖多次了(注意只有一只股票,所以再次购买前要出售掉之前的股票), 而上面的题目只能买卖一次

步骤

dp含义

dp[i][0] — — 第 i 天不持有股票获取的最大利润
dp[i][1] — — 第 i 天持有股票获取的最大利润

递推公式

根据前面的 持有/非持有 的理解, 那么状态应该怎么转移呢?

dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + price[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - price[i]);

初始化

我们通过递推公式发现: 第 i 天的状态是通过 di i - 1天的状态来推导的
⇒ 开始的时候就是 dp[0][0] 和 dp[0][1]
dp[0][0] — — 第 1 天不持有股票的最大利润 — — 第 1 天的钱包是0 — — dp[0][0] = 0;
dp[0][1] — — 第 1 天持有股票的最大利润 — — 第 1 天钱包是0, 就已经买了商品 — — dp[0][1] = -price[0];

遍历方向

通过递推公式发现: 第 i 天的状态是通过 di i - 1天的状态来推导的
⇒ 所以, 遍历方向是 从前向后的

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) 
    {
        int len = prices.size();
        
        // 这里设置2 -- -- 因为就只有两个状态
        vector<vector<int>> dp(len, vector<int>(2)); 
        
        dp[0][0] = 0; // 非持有
        dp[0][1] = -prices[0]; // 持有
        
        for(int i = 1; i < len; i++)
        {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
        }
        
        return dp[len - 1][0]; 
        // 可以是返回两者之间的最大值, 但是一定是飞持有的最大价值 > 持有的最大价值
        // 因为: 非持有代表着卖出去了, 是+prices[i]; 而持有代表着买了没没卖出去, 是-prices[i]
    }
};

谅解、支援和友谊,比什么都重要 — — 毛泽东

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

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

相关文章

IDEA使用方式

1.翻译 1.Plugins插件&#xff1a;Chinese中文插件 文件F 编辑E 视图V 导航N 代码C 分析Z 重构R 构建B 运行U 工具T VCSS 窗口W 帮助H文件N 新建N 打开 打开最近 关闭项目 设置T 项目结构 文件属性 保存全部S 从磁盘全部重新加载 作废缓存/重启 导出/导入操作 其他设置 导出 打…

路径规划算法:基于协作搜索优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于协作搜索优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于协作搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

suse linux 日语字库相关

问题 最近遇到一个日语字库的问题&#xff0c;界面上同一个label显示的日语字体大小都不一样&#xff0c; 如下图&#xff0c;圈出的部分字体大小和其他部分不一样。 分析 考虑两种情况 配置文件有问题缺少字库文件 检查配置文件 参考suse官方文档https://en.opensuse.o…

5.带你入门matlab常见分布的期望和方差(matlab程序)

代码及运行结果 %%  二项分布的期望和方差 clear all; n1100; p10.3; [m1,v1]binostat(n1,p1) %100*0.3 100*0.3*0.7 %% %% 均匀分布的期望和方差 clear all; a11; b15; [m1,v1]unifstat(a1,b1) %% 正态分布的期望和方差 clear all; n12; n23; [m1,v1]normstat(n1,n2) %%…

亚马逊真的赚钱吗?亚马逊多年卖家真实想法揭秘

亚马逊跨境电商真的能赚钱吗&#xff1f;近期收到很多的咨询。理解大家对赚钱的渴望&#xff0c;但凡事都是有利有弊的。至于亚马逊跨境电商能不能赚钱&#xff0c;赚多少&#xff1f;咨询了很多亚马逊多年卖家&#xff0c;今天就跟大家一起聊聊吧&#xff01; 亚马逊跨境电商…

解决dotnet调用https请求被中止未能创建SSL/TLS安全通道

环境:dotnet4.7.2/winserver2012 问题描述: 调用https出现请求被中止,未能创建SSL/TLS安全通道 第一试 自定义SetCertificatePolicy 函数&#xff0c;在建立http连接之前调用 SetCertificatePolicy 函数。 public static void SetCertificatePolicy() {ServicePointManage…

设计模式之建造者设计模式

写在前面 不知道&#xff0c;你在工作中有没有使用过lombok&#xff0c;如果你使用过&#xff0c;不知道你有没有使用过其中的Builder注解&#xff0c;其就会帮我们生成建造者设计模式相关的代码&#xff0c;本文就一起来看下吧&#xff01; 1&#xff1a;介绍 1.1&#xff…

css3的新特性

动画效果 过渡 transition 鼠标放上去瞬间变大 过渡是变大的过程慢慢变化 第一个参数&#xff1a;对哪些值进行过渡。all为hover中所有&#xff0c;也可以指定属性 第二个参数&#xff1a;让动画过渡多长时间。要添加单位&#xff08;s秒&#xff09; 第三个参数&#xff1…

路径规划算法:基于厨师优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于厨师优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于厨师优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法厨师…

【pytest自动化测试框架】从0到1由浅入深详细讲解

一&#xff1a;框架简介 pytest&#xff0c;rf&#xff08;学关键字语法&#xff0c;报告漂亮&#xff09;&#xff0c;unitest   pytest是python的第三方单元测试框架&#xff0c;可以做系统测试&#xff0c;比unitest更简洁和高效&#xff0c;执行315种以上的插件&#xff…

AtcoderABC256场

A - 2^NA - 2^N 题目大意 给n,计算2n 思路分析 可以直接使用幂运算进行计算&#xff0c;也可以利用位运算来快速计算。 使用幂运算&#xff1a;将2连乘N次。利用位运算&#xff1a;2的N次方等于1左移N位&#xff08;即将1的二进制表示中的1向左移N位&#xff09;。 时间复…

Redis数据结构 — SDS

目录 C 语言字符串的缺陷 简单动态字符串SDS 扩容机制 SDS优点 字符串在 Redis 中是很常用的&#xff0c;Key-Value中的Key是字符串类型&#xff0c;Value有时也是字符串类型 Redis 是用 C 语言实现的&#xff0c;但是它没有直接使用 C 语言的 char* 字符数组来实现字符串…

如何激励员工跟踪时间?

正确跟踪工作时间对有效的企业管理和盈利能力起到重要作用。企业通过跟踪时间&#xff0c;监控出勤情况&#xff0c;确保员工收到应得的工资&#xff0c;保护企业的利益。 时间跟踪对企业来说和其他指标一样重要&#xff0c;但他们往往难以说服员工将其视为一种有益的活动。那…

windows 下载安装Redis,并配置开机自启动

windows 下载安装Redis&#xff0c;并配置开机自启动 1. 下载 地址&#xff1a;https://github.com/tporadowski/redis/releases Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择&#xff0c;这里我们下载 Redis-x64-xxx.zip压缩包&#xff0c;之后解压 打…

园区水电能源管理系统平台

园区水电能源管理系统平台是一种集成了水电能源监测、管理和优化功能的平台&#xff0c;旨在帮助园区管理者实现对水电资源的实时监测、合理节能和优化使用。随着能源需求的不断增长和能源价格的不断攀升&#xff0c;园区管理者面临着越来越大的节能减排压力。因此&#xff0c;…

selenium查找svg元素

目录 如何为SVG元素编写XPath 使用local-name&#xff08;&#xff09;的语法 需要记住的一点 将“and”与SVG元素一起使用 如何定位嵌套的SVG元素&#xff1f; XPath是一种用于定位XML文档中的web元素的语言&#xff0c;包括构成网页的HTML文档。在Selenium中&#xff0…

001 Jetpack Compose入门

目录 1.前提准备 2.新建项目 1.前提准备 下载最新版本的AndroidStudio&#xff0c;我目前的版本如下&#xff1a; 注意要将kotlin环境配置好 2.新建项目 新建项目中空Activity就是新建的Compose项目 然后就会得到一个Compose界面的应用 为何要学Compose可以看郭霖的文章&…

拉丁语翻译软件分享-收藏这几个备用

在当今全球化的时代&#xff0c;语言交流变得更加重要。虽然英语已经成为国际通用语言&#xff0c;但依旧有一些古老的语言在特定领域和文化中仍然得到广泛使用。其中&#xff0c;拉丁语作为古代罗马帝国的官方语言&#xff0c;对欧洲语言起了重要的影响。在本文中&#xff0c;…

el-select组件如何在页面一加载时就根据数据选中el-option中的数据

页面一加载就要选中下拉中的数据&#xff0c;要和下拉数组中的value的类型一致&#xff0c;value是number,select的v-model就不能是字符串&#xff0c;必须是number.不然就会显示字符串

【C语言】【数据结构初阶】 快排变慢排?怎么个事儿?

一.为何“快排”变“慢排” 我们知道&#xff0c;快排是一种很好的排序算法。但是在极少数的一些情况下&#xff0c;“快速排序”好像名不副实了。比如&#xff1a;1&#xff0c;2&#xff0c;1&#xff0c;2&#xff0c;1&#xff0c;2&#xff0c;1。。。。。。这样的数列。 …