Day44 算法记录| 动态规划 10 (股票问题)

news2024/12/23 11:25:06

股票问题

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

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

方法一:二维数组的讲解:

在这里插入图片描述

class Solution {
    public int maxProfit(int[] prices) {
     int day = prices.length;
     int[][] dp = new int[day][5];

     //初始化
     dp[0][1] = -prices[0]; //buy1的最大利润
     dp[0][3] = -prices[0]; //buy2的利润
     //开始遍历每一天
     for(int i=1;i<day;i++){
        dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] - prices[i]) ;    //buy1的最大利润: 1.昨天没有操作+今天买入的   2.保持昨天买入的原样
        dp[i][2] = Math.max(dp[i-1][2],dp[i-1][1] + prices[i]) ;   //sold1,最大的利润: 1.之前买入的 + 今天卖出  2.之前就卖了,保持原样
    
        dp[i][3] = Math.max(dp[i-1][3],dp[i-1][2]-prices[i]); // buy2的最大利润: 1.昨天卖出的+今天买入的   2.保持昨天买入的原样
        dp[i][4] = Math.max(dp[i-1][4],dp[i-1][3] + prices[i]) ; // sold2,最大的利润: 1.之前买入的 + 今天卖出  2.之前就卖了,保持原样
     }
  return dp[day-1][4];
    }
}

空间优化,一维数组

class Solution {
    public int maxProfit(int[] prices) {
     int day = prices.length;
     int[] dp = new int[5];

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

     for(int i=1;i<day;i++){
        dp[1] = Math.max(dp[1],-prices[i]);
        dp[2] = Math.max(dp[2],dp[1]+prices[i]);
        dp[3] = Math.max(dp[3],dp[2] - prices[i]);
        dp[4] = Math.max(dp[4],dp[3]+prices[i]);
     }
     return dp[4];
    }
}

方法二:贪心算法

贪心算法

在只能进行一次股票交易,贪心算法,从前往后遍历,记录最底的价格以及最高的利润

class Solution {
    public int maxProfit(int[] prices) {
     int day = prices.length;
    int buy1 = Integer.MAX_VALUE; int buy2 = Integer.MAX_VALUE;
    int sold1 =0;  int sold2 =0;

     for(int i=0;i<day;i++){
       buy1 = Math.min(buy1,prices[i]); //找到最低的进货价格
       sold1 = Math.max(sold1, prices[i] - buy1); //找到第一次卖出的最高利润

       buy2 = Math.min(buy2, prices[i] - sold1 ); //找到第二次最低的进货价格(此时我已经用第一次卖出时候的利润了)
       sold2 = Math.max(sold2,  prices[i] - buy2); //sold2表示卖出两次之后的总利润
     }
     return sold2;
    }
}

188. 买卖股票的最佳时机 IV

方法一:在上一道题二维的基础上,变成三维
dp[天数] [交易次数][交易状态]
交易次数:0表示no-action, 1-k表示交易的次数
交易状态:0表示买入,buy ;1 表示卖出, sold

class Solution {
    public int maxProfit(int k, int[] prices) {
     int day = prices.length;
     int[][][] dp = new int[day][k+1][2];

     //1.初始化,对于每一次交易开始前,买入的利润为-,
     for(int i=1;i<=k;i++){
         dp[0][i][0] = -prices[0]; // dp[0][i][1] = 0;
     }

     //2.开始交易
     for(int i =1;i<day;i++){ // 天数
       for(int j =1;j<=k;j++){ // 轮次
       dp[i][j][0] = Math.max( dp[i-1][j][0],dp[i-1][j-1][1] - prices[i]);  // 买入时的利润,1.保持之前买入状态 2.卖出之前的-买入当天价格)
       dp[i][j][1] = Math.max(dp[i-1][j][1],dp[i-1][j][0]+ prices[i]);     //卖出的利润,1.保持 2.卖出之前的
       }
     }
     return dp[day-1][k][1];
    }
}

空间优化:一维数组

class Solution {
    public int maxProfit(int k, int[] prices) {
     int day = prices.length;
     int[] dp = new int[2*k+1];
    //0 表示no-action
    //1-2k,单数表示买入 , 偶数表示卖出
    
    //1.初始化
    for(int i=1;i<=2*k;i+=2){ //1,3,5....
      dp[i] = -prices[0];
    }

    for(int i=1;i<day;i++){
      for(int j =1;j<=2*k; j+=2){
        dp[j] = Math.max(dp[j],dp[j-1]-prices[i]);
        dp[j+1] = Math.max(dp[j+1],dp[j]+prices[i]);
      }
    }
    return dp[2*k];
    }
}

方法二:贪心算法的改进

class Solution {
    public int maxProfit(int k, int[] prices) {
     //
     int[] buy = new int[k]; //每次交易买入的最低价格
     int[] sold = new int[k]; //每次交易之后,卖出的总利润

     Arrays.fill(buy,Integer.MAX_VALUE);
     for(int price :prices){ // i=0,表示第一次交易
       buy[0] = Math.min(buy[0],price);
       sold[0] = Math.max(sold[0],price-buy[0]);

      for(int i =1;i<k;i++){ 
         buy[i] = Math.min(buy[i],price-sold[i-1]);
         sold[i] = Math.max(sold[i],price-buy[i]);
      }
     }
return sold[k-1];
    }
}

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

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

相关文章

教你使用PHP实现一个轻量级HTML模板引擎

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。多年电商行业从业经验&#xff0c;对系统架构&#xff0c;数据分析处理等大规模应用场景有丰富经验。 &#x1f3c6;本文已收录于PHP专栏&#xff1a;PHP…

Ubuntu系统下:write_frames() got an unexpected keyword argument ‘audio_path‘

在部署Datid3d项目是遇到了一个imageio_ffmpeg的报错问题&#xff0c;网上也没有解决办法&#xff0c;在github上查看这个开源库时发现这个库的0.4.3和0.4.8的版本有差别&#xff0c;具体情况如下图&#xff1a; 0.4.3版本&#xff1a; 0.4.8版本&#xff1a; 我原先装得的是0…

AD 封装组件的水平/垂直间距报错

快捷键&#xff1a;D设计→R规则 一般情况下设置的都是&#xff1a;Electrical 下的Clearance 但是设置完了还是继续报错 是封装之间的水平间距问题 应该设置Placement 下的ComponentClearance

某网站搜索接口参数MD5加密又加盐逆向实战分析

1. 写在前面 最近在写爬虫的时候发现一些小网站上的MD5加密&#xff0c;在我们团队开发的千把个网站爬虫内发现这种MD5加密的案例还不少&#xff01;话不多说&#xff0c;直接拿出来分析一波 之后我准备抽时间总结出一个关于如何快速搜索与定位JS加密函数与分析与辨别常见加密…

dockerfile健康检查HEALTHCHECK

1、dockerfile示例 FROM registry.access.redhat.com/ubi9/ubi-init #关闭订阅管理器功能,便于使用dnf安装软件RUN sed -i s/d1/d0/ /etc/yum/pluginconf.d/subscription-manager.conf RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos…

【前端知识】JavaScript——5个迭代函数:every、filter、forEach、map、some

【前端知识】JavaScript——5个迭代函数&#xff1a;every、filter、forEach、map、some JavaScript高级程序设计(第4版)&#xff1a;ECMAScript 为数组定义了 5 个迭代方法。每个方法接收两个参数&#xff1a;以每一项为参数运行的函数&#xff0c;以及可选的作为函数运行上下…

心率血氧传感器方案

JFH142多光谱健康监测模块&#xff0c;无创采集人体的脉搏波&#xff0c;用户系统只需通过串口即可和模块通信&#xff0c;并且直接获得测量结果&#xff0c;为用户输出实时连续的心率、血氧、血管弹性等健康数据&#xff0c;并通过云端服务器的大数据平台将脉搏波数据进行算法…

双目视觉,立体视觉,双目标定,三维重建,深度估计,棋盘格,RAFTStereo,HitNet,深度估计

github:https://github.com/pcb9382/StereoAlgorithms gitee:https://gitee.com/peng-chuanbo/StereoAlgorithms StereoAlgorithms 简体中文 | English 如果觉得有用&#xff0c;不妨给个Star⭐️&#x1f31f;支持一下吧~ 谢谢&#xff01; Acknowledgments & Contact…

解决IDEA的git非常缓慢方法

解决IDEA的git非常缓慢方法 xxxx\IDEA2021.1.3\IntelliJ IDEA 2021.1.3\bin

2023最新Ubuntu安装部署Gitlab详细教程(每个步骤均配图)

Ubuntu安装配置Gitlab详细步骤 安装依赖 打开终端&#xff0c;运行如下命令&#xff1a; sudo apt updatesudo apt-get upgradesudo apt-get install curl openssh-server ca-certificates postfix接下来会遇到如下界面&#xff0c;Tab切换到“确定”按钮&#xff0c;然后回…

ThinkPHP8知识详解:ThinkPHP8是什么?

欢迎你来到PHP服务网学习最新的ThinkPHP8开发教程&#xff0c;本文介绍一下ThinkPHP8是什么&#xff1f; 1、ThinkPHP8是ThinkPHP框架的最新版本&#xff0c;它在之前版本的基础上进行了改进和优化。它采用了现代化的设计理念和架构&#xff0c;提供了更好的性能和更丰富的功能…

GRE TAP的工作原理与5G工业物联网中的应用

随着互联网新技术的发展以及智能化水平的提高&#xff0c;各企业对实时数据传输的需求也在不断提升&#xff0c;企业愈发重视数据中心的建设&#xff0c;以保障企业内网数据安全。 GRE&#xff08;Generic Routing Encapsulation&#xff0c;通用路由封装&#xff09;协议属于…

opencv-26 图像几何变换04- 重映射-函数 cv2.remap()

什么是重映射&#xff1f; 重映射&#xff08;Remapping&#xff09;是图像处理中的一种操作&#xff0c;用于将图像中的像素从一个位置映射到另一个位置。重映射可以实现图像的平移、旋转、缩放和透视变换等效果。它是一种基于像素级的图像变换技术&#xff0c;可以通过定义映…

vue项目中对组件使用v-model绑定值,在vue3中如何更新数据

在el-form 中 el-form-item 绑定组件进行校验 想在表单下面爆红提示 可以对组件使用v-model绑定值 vue2 通过this.$emit(‘input’,value) 更新 v-model值 vue3 通过this.$emit(‘update:modelValue’ ,value) 更新 v-model值

管理类联考——写作——素材篇——论说文——人工智能

有人说&#xff0c;机器人的使命应该是帮助人类做那些人类做不了的事情&#xff0c;而不是替代人类。技术变革会夺取一些人低端繁琐的工作岗位&#xff0c;最终也会创造更高端更人性化的工作机会。例如&#xff0c;铁路的出现抢去了很多挑夫的工作&#xff0c;但也增加了千百万…

资源成本降低70%!华为MetaERP资产核算的Serverless架构实践

资产核算是指在一定的财务周期&#xff0c;对企业拥有的房屋建筑物、机器设备、商标权和专利权等资产的取得、折旧和处置的会计核算&#xff0c;反映企业固定资产、无形资产的增减变动和价值分摊活动。华为资产核算产品&#xff0c;支撑企业资产从获取到处置全生命周期的管理和…

synchronized关键字同步原理

1.同步方法 public class Test {synchronized public static void testMethod(){}public static void main(String[] args) {testMethod();} }// 实现class文件的反汇编 java -c -v *.class从字节码文件中可以看到同步方法根据flags标志中的ACC_SYNCHRONIZED来判别是否是同步方…

动态内存管理面试题

动态内存管理面试题 文章目录 动态内存管理面试题一、第一题此代码存在的问题运行结果分析原因修改 二、第二题此代码存在的问题运行结果分析原因修改 一、第一题 代码如下&#xff08;示例&#xff09;&#xff1a; #include<stdio.h> #include<string.h> #incl…

快速学习Protobuf

目录 1. 什么是Protobuf&#xff1f; 2. 安装与设置 3. 定义消息 4. 编写.proto文件 5. 编译.proto文件 6. 序列化与反序列化 7. 使用Proto文件 8. Protobuf高级特性 1. 什么是Protobuf&#xff1f; 简介&#xff1a;Protobuf&#xff08;Protocol Buffers&#xff09;…

opencv python 训练自己的分类器

源码下载 一、分类器制作 1.样本准备 收集好你所需的正样本&#xff0c;和负样本&#xff0c;分别保存在不同文件夹 在pycharm新建项目&#xff0c;项目结构如下&#xff1a;has_mask文件夹放置正样本&#xff0c;no_mask文件夹放置负样本 安装opencv&#xff0c;把opencv包…