算法学习——LeetCode力扣动态规划篇6

算法学习——LeetCode力扣动态规划篇6

在这里插入图片描述

121. 买卖股票的最佳时机

121. 买卖股票的最佳时机 - 力扣(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 <= 105
0 <= prices[i] <= 104

代码解析

动态规划-找到最小价格计算
class Solution {
public:
    int maxProfit(vector<int>& prices) {

        if(prices.size()<=1) return 0;
        vector<int> dp(prices.size() , 0);
        int min = prices[0];
        
        for(int i=1 ; i<prices.size() ;i++)
        {
           if(prices[i] < min) min = prices[i];
           dp[i] = max( dp[i-1] , prices[i] - min );
        }

        // for(auto it:dp) cout<<it<<' ';
        return dp[prices.size()-1];
    }
};

动态规划-二维dp分析

确定dp数组以及下标的含义

  • dp[i][0] 表示第i天持有股票所得最多现金
  • dp[i][1] 表示第i天不持有股票所得最多现金

确定递推公式

  • 第i天持有股票即dp[i][0], 那么可以由两个状态推出来
    • 第i-1天就持有股票,那么就保持现状,dp[i][0] = dp[i - 1][0]
    • 第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]
    • 那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);
  • 第i天不持有股票即dp[i][1], 也可以由两个状态推出来
    • 第i-1天就不持有股票,那么就保持现状,dp[i - 1][1]
    • 第i天卖出股票,所得现金就是价格卖出后所得现金即:prices[i] + dp[i - 1][0]
    • 同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);

dp数组如何初始化

  • 那么dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0][0] -= prices[0];

  • dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0;

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() <= 1) return 0;
        vector<vector<int>> dp(prices.size() ,vector<int>(2,0) );

        dp[0][0] = -prices[0];
        dp[0][1] = 0;

        for(int i=1 ; i<prices.size() ;i++)
        {
            dp[i][0] = max( dp[i-1][0] , -prices[i] );//当天持有股票
            dp[i][1] = max( dp[i-1][1] , dp[i-1][0] + prices[i]);//当天不持有股票
        }
        return dp[prices.size()-1][1];
    }
};

122. 买卖股票的最佳时机 II

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

描述

给你一个整数数组 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

代码解析

贪心算法

核心思想是找到利润。然后利润大于0的相加

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<int> profit; 
        int result = 0;
        for(int i=1 ;i < prices.size(); i++)
        {
            if(prices[i] - prices[i-1] > 0 ) //单日利润大于0的存入
                profit.push_back(prices[i] - prices[i-1]);
        }

        for(int i=0 ; i < profit.size(); i++) //计算利润和
            result += profit[i]; 

        return result;
    }
};
动态规划

dp数组的含义:

  • dp[i][0] 表示第i天持有股票所得现金。
  • dp[i][1] 表示第i天不持有股票所得最多现金

如果第i天持有股票即dp[i][0]

  • 第i-1天就持有股票,那么就保持现状,即:dp[i - 1][0]
  • 第i天买入股票,就是昨天不持有股票的所得现金减去今天的股票价格
    即:dp[i - 1][1] - prices[i]

如果第i天不持有股票即dp[i][1]的情况

  • 第i-1天就不持有股票,那么就保持现状,即:dp[i - 1][1]
  • 第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金
    即:prices[i] + dp[i - 1][0]
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size()<=1) return 0;
        vector<vector<int>> dp(prices.size() , vector<int>( 2,0 ) );

        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for(int i=1 ; i<prices.size() ;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[prices.size()-1][1];
    }
};

123. 买卖股票的最佳时机 III

123. 买卖股票的最佳时机 III - 力扣(LeetCode)

描述

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例

示例 1:

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

示例 2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这个情况下, 没有交易完成, 所以最大利润为 0。

示例 4:

输入:prices = [1]
输出:0

提示

1 <= prices.length <= 105
0 <= prices[i] <= 105

代码解析
动态规划

确定dp数组以及下标的含义

  1. 没操作
  2. 第一次持有股票(包括之前买的和今天买的)
  3. 第一次不持有股票(包括之前没买和今天卖了)
  4. 第二次持有股票
  5. 第二次不持有股票

dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。

确定递推公式

达到持有状态,有两个具体操作:

  • 第i天买入股票了,那么dp[i][1/3] = dp[i-1][0/2] - prices[i]
  • 第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1/3] = dp[i - 1][1/3]

达到不持有状态,也有两个操作:

  • 第i天卖出股票了,那么dp[i][2/4] = dp[i - 1][1/3] + prices[i]
  • 第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2/4] = dp[i - 1][2/4]

dp数组如何初始化

  • dp[0][0] = 0;
  • dp[0][1/3] = -prices[0];
  • dp[0][2/4] = 0;

在这里插入图片描述

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() <=1 ) return 0;
        vector<vector<int>> dp( prices.size() , vector<int>(5,0));
        int k=2;

        dp[0][1] = -prices[0];
        dp[0][3] = -prices[0];

        for(int i=1 ; i<prices.size() ;i++ )
        {
            dp[i][0] = dp[i-1][0];
            dp[i][1] = max( dp[i-1][1] , dp[i-1][0] - prices[i] ); 
            dp[i][2] = max( dp[i-1][2] , dp[i-1][1] + prices[i] ); 

            dp[i][3] = max( dp[i-1][3] , dp[i-1][2] - prices[i] ); 
            dp[i][4] = max( dp[i-1][4] , dp[i-1][3] + prices[i] ); 
        }
        return dp[prices.size()-1][4];
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三元组数据模型:构建知识图谱的基石

目录 前言1. 三元组数据模型概述1.1 定义与结构1.2 特点 2. 三元组在知识图谱中的应用2.1 知识表示2.2 知识推理2.3 数据整合 3 三元组的数据格式3.1 N-Triples &#xff1a;3.2 RDF/XML &#xff1a;3.3 Turtle &#xff08;又称为 Terse RDF Triple Language&#xff09;&…

编程语言|C语言——数组与指针

一、数组 同一类型的变量——元素&#xff08;element&#xff09;集中在一起&#xff0c;在内存上排列成一条直线&#xff0c;这就是数组&#xff08;array&#xff09;。 1.1 一维数组 一维数组的声明 int arr1[10]; int arr2[2 8];#define N 10 int arr3[N];int count 10;…

JavaScript的学习笔记

<script src"index.js" defer></script>&#xff0c;defer的作用是延迟加载index.js文件 定义变量 变量的类型分为两大类&#xff1a;基本类型和复合类型 JavaScript是一种弱类型语言&#xff0c;所以没有强类型语言所具有的int,float,char等等&#x…

无药可医还能怎么办?越没本事的人,越喜欢从别人身上找原因!——早读(逆天打工人爬取热门微信文章解读)

无药可医的病该怎么办呢&#xff1f; 引言Python 代码第一篇 洞见 《骆驼祥子》&#xff1a;越没本事的人&#xff0c;越喜欢从别人身上找原因第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 “吾日三省吾身&#xff0c;而后深知自助者天助之。” 在人生的迷宫中 遭遇困境时…

域环境共享文件夹,容量配额管理

首先&#xff0c;我们先创建一个新的磁盘&#xff0c;必须在服务器关机的状态下创建&#xff0c;只有在关机状态下才能创建NVMe类型的磁盘。 打开此电脑&#xff0c;右击创建的磁盘&#xff0c;点击属性。 点击共享&#xff0c;点击高级共享。 将共享此文件夹勾选上&#xff0c…

蓝桥杯 第2945题 课程抢购 C++ Java Python

目录 题目 思路和解题方法 c 代码 Java 版本&#xff08;仅供参考&#xff09; Python 版本&#xff08;仅供参考&#xff09; 代码细节&#xff1a; C 代码细节解释: Python 代码细节解释: lenyan算法笔记 语雀 《lenyan算法笔记》 个人笔记日常更新。含金量不高。/…

ZNC3罗德与施瓦茨ZNC3网络分析仪

181/2461/8938产品概述&#xff1a; 罗德与施瓦茨 ZNC3 网络分析仪的工作频率范围为 9 kHz 至 3 GHz&#xff0c;面向移动无线电和电子产品行业的应用。它具有双向测试装置&#xff0c;用于测量有源和无源 DUT 的所有四个 S 参数。此外&#xff0c;它还提供适合开发和生产中各…

2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)

C题-翻转⭐ 标签:贪心 简述:如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 链接: 翻转 思路:要求步骤最少->S每个位置最多修改一次->从头开始遍历不匹配就翻转->翻转不了就-1 …

esp32中vscode的开发环境

vscode中安装esp32开发环境请参考&#xff1a;CSDN 1、调出esp32的控制面板View ->Command Paletter&#xff0c;或者快捷键&#xff08;ctrshitp&#xff09; 调出esp-idf的样例工程 选择ESP-IDF所在的安装路径 选择一个样例工程&#xff0c;作为工程模板 创建的新工程如…

基于springboot实现课程作业管理系统项目【项目源码+论文说明】

基于springboot实现课程作业管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景…

swift中的autoreleasepool(自动释放池)有用么?

想到一个问题 swift中的autoreleasepool(自动释放池)有用么? 我们进行验证一下 首先我们写一个加载图片的方法,保证会真正用到真实的IMP内存func loadBigData(string: String?) {if let path Bundle.main.path(forResource: "big", ofType: "png") {for…

[数据库]windows环境安装mysql数据库服务

mysql介绍 MySQL是一个流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是由瑞典的MySQL AB公司开发&#xff0c;后来被Sun Microsystems收购&#xff0c;再后来Sun被Oracle收购。MySQL以其稳定性、可靠性、高性能和开放源代码的特性而闻名&#xff0c…

完整部署一套k8s-v.1.28.0版本的集群

一、系统情况 虚拟机版本&#xff1a;esxi 6.7 系统版本&#xff1a;centos7.9_2009_x86 配置&#xff1a;4核8G&#xff08;官网最低要求2核2G&#xff09; 192.168.0.137 master节点 192.168.0.139 node2节点 192.168.0.138 node1节点&#xff08;节点扩容练习&#xf…

剑指Offer题目笔记21(计数排序)

面试题74&#xff1a; 问题&#xff1a; ​ 输入一个区间的集合&#xff0c;将重叠的区间合并。 解决方案&#xff1a; ​ 先将所有区间按照起始位置排序&#xff0c;然后比较相邻两个区间的结束位置就能知道它们是否重叠。如果它们重叠就将它们合并&#xff0c;然后判断合并…

C++ namespace 使用梳理

前言 发现 namespace 这个小细节在工作项目中处理的有一点点小混乱&#xff0c;于是稍微梳理了一下关于 C namespace 使用相关的使用内容&#xff0c;为日后项目的重构做准备&#xff0c;虽然是很小的点&#xff0c;但是也是值得注意的&#xff0c;毕竟代码的质量体现在每一个…

Java项目实战笔记--基于SpringBoot3.0开发仿12306高并发售票系统--(二)项目实现-第五篇-核心功能车票预定开发及nacos集成

本文参考自 Springboot3微服务实战12306高性能售票系统 - 慕课网 (imooc.com) 本文是仿12306项目实战第&#xff08;二&#xff09;章——项目实现 的第五篇&#xff0c;本篇讲解该项目的核心功能——余票查询、车票预定功能的基础版开发&#xff0c;以及讲解项目与Nacos的集成…

linux 下固定摄像头的设备名字

为什么写着一篇文章 在做基于ARM-Linux的垃圾分类垃圾桶的时候&#xff0c;在不小心松动usb摄像头的或者是重新连接的时候&#xff0c;摄像头的编号会改变。有时候etc/udev/video2 &#xff0c;有时etc/udev/video3这样使得每次运行的时候都需要修改编号。 什么是udev规则 u…

Pillow教程03:图像处理的基本步骤+分离split+合并merge+混合blend+composite遮罩

--------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁剪…

mysql进阶知识总结

1.存储引擎 1.1MySQL体系结构 1).连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff0c;为通过认证…

关于v114之后的chromedriver及存放路径

使用selenium调用浏览器时&#xff0c;我一直调用谷歌浏览器&#xff0c;可浏览器升级后&#xff0c;就会再次遇到以前遇到过的各种问题&#xff0c;诸如&#xff1a;1、怎么关闭浏览器更新&#xff1b;2、去哪儿下载chromedriver&#xff1b;3、114版本之后的驱动去哪儿下载&a…