day 49 :121. 买卖股票的最佳时机;122. 买卖股票的最佳时机 II;123. 买卖股票的最佳时机 III

news2024/11/24 23:10:36

买卖股票

  • 121. 买卖股票的最佳时机:一次买入卖出
    • 1. 贪心算法
    • 2. 动态规划
      • 1. dp数组以及下标名义
      • 2. 递归公式
      • 3. dp数组如何初始化
      • 4. 代码
  • 122. 买卖股票的最佳时机 II:可以多次买入卖出
    • 2. 动态规划
      • 1. dp数组以及下标名义
      • 2. 递归公式
      • 3. dp数组如何初始化
      • 4. 代码
  • 123. 买卖股票的最佳时机 III:最多完成两笔交易
    • 2. 动态规划
      • 1. dp数组以及下标名义
      • 2. 递归公式
      • 3. dp数组如何初始化
      • 4. 代码
  • 188. 买卖股票的最佳时机 IV:k次买入,k次卖出
    • 2. 动态规划
      • 1. dp数组以及下标名义
    • 2. 递归公式
      • 3. dp数组如何初始化
      • 4. 代码

121. 买卖股票的最佳时机:一次买入卖出

在这里插入图片描述

1. 贪心算法

找最左边的最小值,和最右边的最大值,相减

class Solution {
public://贪心
    int maxProfit(vector<int>& prices) {
        int leftmin = INT_MAX;
        int result = 0;
        for(int i = 0; i < prices.size(); i++) {
            leftmin = min(leftmin, prices[i]);
             result = max(result, prices[i] - leftmin);
        }      
     return result;
    }
};

2. 动态规划

1. dp数组以及下标名义

dp[i][0] : 第i天,持有股票的最大收益, 可能之前买了不一定i天买

dp[i][1] : 第i天,不持有股票的最大收益,可能之前卖了不一定i天卖

2. 递归公式

如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来

  1. 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]

  2. 第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i],现金本身为0,股票只买卖一次

  3. 所以:dp[i][0] = max(dp[i - 1][0],-prices[i])
    如果第i天不持有股票即dp[i][1], 那么可以由两个状态推出来

  4. 第i-1天就不持有股票,那么就保持现状, 即:dp[i - 1][1]

  5. 第i天卖出股票,所得现金就是卖出今天的股票后所得现金即:dp[i - 1][0] + prices[i]

  6. 所以:dp[i][0] = max(dp[i - 1][0] + prices[i], dp[i - 1][1])

3. dp数组如何初始化

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

4. 代码

class Solution {
public://贪心
    int maxProfit(vector<int>& prices) {
        vector<vector<int>>dp(prices.size() + 1, vector<int>(2 , 0));
        dp[0][0] = - prices[0];
        for(int i = 1; i < prices.size(); i++) {
            dp[i][0] = max(dp[i - 1][0], - prices[i]); //第i天持有股票即dp[i][0]= 第i-1天就持有股票 or 第i天买入股票
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);//第i天不持有股票即dp[i][1] =第i-1天就不持有股票or第i天卖出股票
        }
        return max(dp[prices.size() - 1][0], dp[prices.size() - 1][1]);
    }
};

122. 买卖股票的最佳时机 II:可以多次买入卖出

在这里插入图片描述

2. 动态规划

1. dp数组以及下标名义

dp[i][0] : 第i天,持有股票的最大收益, 可能之前买了不一定i天买

dp[i][1] : 第i天,不持有股票的最大收益,可能之前卖了不一定i天卖

2. 递归公式

如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来

  1. 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]

  2. 第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i],现金本身为0,股票只买卖一次

  3. 所以:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] -prices[i])和上一题不一样的地方
    如果第i天不持有股票即dp[i][1], 那么可以由两个状态推出来

  4. 第i-1天就不持有股票,那么就保持现状, 即:dp[i - 1][1]

  5. 第i天卖出股票,所得现金就是卖出今天的股票后所得现金即:dp[i - 1][0] + prices[i]

  6. 所以:dp[i][0] = max(dp[i - 1][0] + prices[i], dp[i - 1][1])

3. dp数组如何初始化

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

4. 代码

class Solution {
public://贪心
    int maxProfit(vector<int>& prices) {
        vector<vector<int>>dp(prices.size() + 1, vector<int>(2 , 0));
        dp[0][0] = - prices[0];
        for(int i = 1; i < prices.size(); i++) {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]- prices[i]); //第i天持有股票即dp[i][0]= 第i-1天就持有股票 or 第i天买入股票
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);//第i天不持有股票即dp[i][1] =第i-1天就不持有股票or第i天卖出股票
        }
        return max(dp[prices.size() - 1][0], dp[prices.size() - 1][1]);
    }
};

123. 买卖股票的最佳时机 III:最多完成两笔交易

2. 动态规划

1. dp数组以及下标名义

一天一共就有五个状态,

0:没有操作 (其实我们也可以不设置这个状态)
1:第一次持有股票
2:第一次不持有股票
3:第二次持有股票
4:第二次不持有股票

2. 递归公式

情况一. dp[i][1]:

如果第i天第一次持有股票即dp[i][1], 不是说第i天一定要买入股票,可能之前就买入了股票

  1. 操作一:第i-1天没有操作:第一次持有股票:dp[i - 1][1]
  2. 操作二:第i天买入股票,则第i-1天不持有股票:- prices[i]
  3. 所以:dp[i][1] = max(dp[i - 1][1], - prices[i])

情况二. dp[i][2]:

  1. 操作一:第i天没有操作:延续前一天:dp[i - 1][2]
  2. 操作二:第i天卖出股票,则:dp[i - 1][1] + prices[i]
  3. dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])

情况三. dp[i][3]:

  1. 操作一:第i天没有操作:dp[i - 1][3]
  2. 操作二:第i天买入股票,则:dp[i - 1][2] - prices[i]
  3. dp[i][3] = max(dp[i - 1][2] - prices[i], dp[i - 1][3])

情况四. dp[i][4]:

  1. 操作一:第i天没有操作:延续前一天:dp[i - 1][4]
  2. 操作二:第i天卖出股票,则:dp[i - 1][3] + prices[i]
  3. dp[i][4] = max(dp[i - 1][3] + prices[i], dp[i - 1][4])

3. dp数组如何初始化

dp[0][1] = -p[0];
dp[0][3] = -p[0];
第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,然后再买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少。

4. 代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>>dp(prices.size() + 1, vector<int>(5, 0));
        dp[0][1] = - prices[0];
        dp[0][3] = - prices[0];
        for(int i = 1; i < prices.size(); i++) {
            dp[i][1] = max(dp[i - 1][1], - prices[i]);
            dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2]);
            dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
            dp[i][4] = max(dp[i - 1][3] + prices[i], dp[i - 1][4]);
        }
        int high1 = max(dp[prices.size() - 1][1], dp[prices.size() - 1][2]);
        int high2 = max(dp[prices.size() - 1][3], dp[prices.size() - 1][4]);
   return max(high1,high2);
    }
};

188. 买卖股票的最佳时机 IV:k次买入,k次卖出

2. 动态规划

1. dp数组以及下标名义

使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]
j的状态表示为:

0 表示不操作
1 第一次买入
2 第一次卖出
3 第二次买入
4 第二次卖出

2. 递归公式

情况一. dp[i][1]:

如果第i天第一次持有股票即dp[i][1], 不是说第i天一定要买入股票,可能之前就买入了股票

  1. 操作一:第i-1天没有操作:第一次持有股票:dp[i - 1][1]
  2. 操作二:第i天买入股票,则第i-1天不持有股票:- prices[i]
  3. 所以:dp[i][1] = max( - prices[i],dp[i - 1][1])

情况二. dp[i][2]:

  1. 操作一:第i天没有操作:延续前一天:dp[i - 1][2]
  2. 操作二:第i天卖出股票,则:dp[i - 1][1] + prices[i]
  3. dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])

情况三. dp[i][3]:

  1. 操作一:第i天没有操作:dp[i - 1][3]
  2. 操作二:第i天买入股票,则:dp[i - 1][2] - prices[i]
  3. dp[i][3] = max(dp[i - 1][2] - prices[i], dp[i - 1][3])
  for(int i = 1; i < prices.size(); i++) {
  for(int j = 0; j < 2 * k - 1; j = j + 2) { //k = 2时  
            dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
            dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
        }

3. dp数组如何初始化

 for(int i = 1; i < 2 * k; i =+ 2) {
            dp[0][i] = - prices[0];
        }

4. 代码

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        vector<vector<int>>dp(prices.size() + 1, vector<int>(2 * k + 1, 0));
        for(int i = 1; i < 2 * k; i = i + 2) {
            dp[0][i] = - prices[0];
        }
        for(int i = 1; i < prices.size(); i++) {
            for(int j = 0; j < 2 * k - 1; j = j + 2) { //k = 2时  
            dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
            dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
        }
       }
        return dp[prices.size() - 1][2 * k];
    }
};

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

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

相关文章

Linux_进程

目录 一.进程概念与子进程 1.进程基本概念 2.通过系统调用创建子进程-fork 二.进程状态 1、一般进程状态 2、Linux操作系统的进程状态 三.环境变量 1.概念 2.环境变量组织与获取 3.配置文件 4.环境变量的全局属性​编辑 5.命令行参数 四.进程优先级 1.查看系统进…

Linux文件系统-磁盘划分

一、磁盘使用 windows系统中&#xff1a; 1、分区 2、格式化 3、自动装载 4、使用 Linux系统中&#xff1a;1、分区 2、格式化 3、手动挂载 &#xff08;挂载到/etc/fstab实现开机自启&#xff09; 4、使用 Linux系统中磁盘使用&#xff1a; 1、分区操作…

rust:cargo 和rustc 以及一点 小技巧

在正式学习 Rust 语言以前&#xff0c;我们需要先学会怎样输出一段文字到命令行&#xff0c;这几乎是学习每一门语言之前必备的技能&#xff0c;因为输出到命令行几乎是语言学习阶段程序表达结果的唯一方式。 在之前的 Hello, World 程序中大概已经告诉了大家输出字符串的方式…

system V共享内存

一、前言 共享内存是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递将不再涉及到内核&#xff0c;换句话说&#xff0c;进程将不再通过执行进入系统内核的系统调用来传递彼此的数据。 但其实比它好用的进程间通信还有很多种&…

Android HTTP请求方式:HttpClient

1.HttpClient使用流程 基本流程&#xff1a; 2.HttpClient使用示例 1&#xff09;使用HttpClient发送GET请求 直接贴下简单的发送Get请求的代码&#xff1a; public class MainActivity extends Activity implements OnClickListener { private Button btnGet; private WebV…

什么是OSPF被动接口?如何配置?华为、思科、瞻博网络三厂商命令来了

OSPF&#xff08;开放最短路径优先&#xff09;是一种常用的动态路由协议&#xff0c;用于在大型网络中实现路由选择。在OSPF中&#xff0c;被动接口是一种特殊类型的接口&#xff0c;它被用来监测网络中的邻居关系&#xff0c;并接收来自邻居发送的Hello消息。被动接口不主动发…

华为OD机试之在字符串中找出连续最长的数字串(含“+-”号)(Java源码)

在字符串中找出连续最长的数字串(含“”号) 输入描述 请在一个字符串中找出连续最长的数字串&#xff0c;并返回这个数字串。 如果存在长度相同的连续数字串&#xff0c;返回最后一个。 如果没有符合条件的字符串&#xff0c;返回空字符串””。 注意&#xff1a; 数字串可以由…

Ansible进阶2——角色管理

文章目录 一、角色1.1 获取角色方式1.2 角色结构1.3 定义变量和默认变量1.4 使用方法1.5 控制playbook中的任务执行流程 二、红帽企业Linux系统角色2.1 常见系统角色2.2 使用系统时间同步角色 三、自定义角色3.1 创建角色目录结构3.2 编写角色内容3.3 编写总结 四、ansible gal…

【C++】内存管理的基本操作,new与delete的实现原理以及operator new与operator delete函数

文章目录 前言一、new,delete操作内置类型二、new/delete操纵自定义类型3. operator new与operator delete函数4. new/delete实现原理4.malloc/free和new/delete的区别 前言 程序中内存的划分&#xff1a; 栈又叫堆栈–非静态局部变量/函数参数/返回值等等&#xff0c;栈是向…

高考必胜,归来仍是少年!

高考必胜&#xff0c;归来仍是少年&#xff01; 这是小索奇专门为高考生写的文章高考生 我以前给大家弄过一些免费的付费资料&#xff0c;现在看到后台很多伙伴们都在寻找资料&#xff0c;一些没有充分准备的小伙伴此刻一定很匆忙吧&#xff01; 我想对大家说&#xff1a; 高…

基于 FFMPEG 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)

系列文章目录 基于 FFMPEG 的跨平台视频播放器简明教程&#xff08;一&#xff09;&#xff1a;FFMPEG Conan 环境集成 文章目录 系列文章目录前言基础知识视频&#xff0c;你所看到的&#xff01;音频 - 你所听到的声音编解码器 - 压缩数据容器 - 存放音频和视频的地方 解封…

vue3.0与vue2.0的区别简记(基于官方文档)

vue3.0与vue2.0的区别简记&#xff08;基于官方文档&#xff09; 基于vue3.0和vue2.0官方文档简单记录vue3.0版本和2.0版本的区别。 一直没有看文档的习惯&#xff08;就是不爱学习&#xff0c;现在吃了没文化的亏&#xff09;&#xff0c;遇到问题才去补充点食粮&#xff0c…

祝2023高考考生高考顺利!金榜题名

前言&#xff1a;光阴似箭&#xff0c;岁月如梭。明天就是全国每年一次的高考了&#xff0c;我也即将结束我的大一生活成为一名大二的小学长啦嘿嘿。而我今天呢主要是想祝马上要高考的学弟学妹们高考顺利&#xff0c;金榜题名&#xff0c;并且借此机会顺便讲讲我的高考前后的故…

解决python通过pip离线安装flask,numpy报错解决(centos)

1. 离线安装Python https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz 解压&#xff0c;编译&#xff0c;安装 tar xzvf Python-3.7.1.tgz ./configuremakemake install 离线环境下如果系统不是完整版安装编译会报错&#xff0c;需要解决依赖问题&#xff0c;如下&am…

5 种常见的 Linux 打包类型:tar、gzip、bzip2、zip 、 7z

在 Linux 系统中&#xff0c;打包和压缩文件是常见的操作。不同的打包类型适用于不同的用途和需求。本文将详细介绍 5 种常见的 Linux 打包类型&#xff0c;包括tar、gzip、bzip2、zip 和 7z&#xff0c;以及它们的特点、使用方法和适用场景。 1. tar tar&#xff08;tape arc…

音悦台项目测试报告

文章目录 项目背景项目功能测试计划与设计功能测试自动化测试 测试结果功能测试结果UI自动化测试结果 项目背景 现如今人们的生活压力大&#xff0c;容易使人疲惫&#xff0c;为了使得人们在闲暇之余可以听音乐放松&#xff0c;为此设计出一款轻量的听音乐网站&#xff0c;快速…

centos安装部署Kubernetes(k8s)步骤使用kubeadm方式

文章目录 1、修改系统配置2、安装docker应用3. 拉取docker镜像4、cri-dockerd安装5、安装kubeadm和kubelet6、配置flannel网络插件7、Node节点加入集群操作 机器地址&#xff1a; 192.168.0.35 k8s-master 192.168.0.39 k8s-node1 192.168.0.116 k8s-node2 1、修改系统配置 修…

Web应用技术(第十六周/持续更新)

本次联系基于how2j的教程完成对SpringBoot的初步学习。 初识Springboot 学习导入&#xff1a;1.第一个基于SpringBoot的项目&#xff1a;&#xff08;1&#xff09;application.java&#xff1a;该文件中的核心代码&#xff1a; &#xff08;2&#xff09;HelloController.jav…

一. ATR技术指标的定义与运用

一. ATR的定义 1. 什么是ATR ATR英文全名是Average true range&#xff0c;翻译过来就是平均真实波幅&#xff0c;这个指标主要用来衡量最近N天TR(真实波幅)的平均值。 2. ATR相关计算公式 T R [ ( 最高价 − 最低价 ) &#xff0c; ( 前一次收盘价 − 最高价 ) &#xff0…

macOS Sonoma 14.0 Beta 1 (23A5257q) Boot ISO 原版可引导镜像

macOS Sonoma 14.0 Beta 1 (23A5257q) Boot ISO 原版可引导镜像 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和…