动态规划(day10)买卖股票问题

目录

121. 买卖股票的最佳时机(需要消化下dp的定义和赋值)

看到题目的第一想法               

看到代码随想录之后的想法

自己实现过程中遇到的困难

122.买卖股票的最佳时机II(需要理解与消化)

看到题目的第一想法               

看到代码随想录之后的想法

自己实现过程中遇到的困难


121. 买卖股票的最佳时机(需要消化下dp的定义和赋值)

力扣题目链接(opens new window)

给定一个数组 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
    解释:在这种情况下, 没有交易完成,

看到题目的第一想法
               

   1 使用暴力,两层for,记录最大差值

   2 使用贪心,从第一个递增的位置开始,求最大的sum

   3 卡哥要求使用dp ,但是我没想出办法

        令dp为最大利润,无法判断

看到代码随想录之后的想法

        对于第i天的股票,有两种状态

        1 买入状态

                1 之前就买入

                2 第i天买入

        2 卖出状态

                1 之前就卖出

                2 第i天卖出

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

        int dp[i][2]

        dp[i][0]:代表第i天持有股票的最大现金

        dp[i][1]:代表卖出后的值,第i天不持有股票的最大现金 

        确定递推公式

        若当天买入 则为 -price[i]
        dp[i][0] = Math.max(dp[i-1][0],0-price[i])

        若当天卖出,则为dp[i-1][0]+price[i]

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

       dp数组初始化

        dp[0][0]=-price[i]

        dp[0][1] = 0

        确定遍历顺序

        从前往后

        举例推导dp数组

                

自己实现过程中遇到的困难

        过程比较绕需要再消化一下

        dp的定义和赋值

class Solution {public int maxProfit(int[] prices) {//我的做法//暴力,两层for求最大差值,进行返回//贪心,从第一个前面小于后面的开始,看后面的最大差值/*int maxDiff=0;for(int i=0;i<prices.length-1;i++){if(prices[i]<prices[i+1]){int j=i+1;while(j<prices.length&&prices[i]<=prices[j]){int diff =  prices[j]-prices[i];maxDiff = maxDiff>diff?maxDiff:diff;j++;}i=j-1;}}return maxDiff;*///卡哥思路,统一做法二维数组//dp数组的定义和下标的含义//dp[i][0]第i天持有股票的现金最大值,dp[i][1]第i天不持有股票的所得最大现金//确定递推公式//dp[i][0] 第i天持有股票的最大现金之前和今天哪个拥有现金最大,取最大的Math.max(dp[i-1][0],-price[i]);//dp[i][1] 第i天不持有股票的最大值,看之前卖出后和今天卖出后哪个最大//Math.max(dp[i-1][1],dp[i-1][0]+price[i]);//dp数组初始化// dp[0][0] = -price[0],dp[0][1] = 0;//确定遍历顺序//从前往后//举例推导dp数组//打印dp数组int[][] dp = new int[prices.length][2];dp[0][0]=-prices[0];dp[0][1]=0;for(int i=1;i<prices.length;i++){//之前和今天买入哪个拥有的现金最多dp[i][0] = Math.max(dp[i-1][0],-prices[i]);//之前卖出和今天卖出(今天卖出的,前一天买入的留下最大现金卖出则+prices[i],dp[i-1][0]+price[i])dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);}return dp[prices.length-1][1];}
}

122.买卖股票的最佳时机II(需要理解与消化)

力扣题目链接(opens new window)

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

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

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

  • 示例 1:

  • 输入: [7,1,5,3,6,4]

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

  • 示例 2:

  • 输入: [1,2,3,4,5]

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

  • 示例 3:

  • 输入: [7,6,4,3,1]

  • 输出: 0
    解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

  • 1 <= prices.length <= 3 * 10 ^ 4
  • 0 <= prices[i] <= 10 ^ 4
看到题目的第一想法
               

         使用贪心,从第一个递增的位置开始,求最大的sum

       卡哥要求使用dp ,按照之前的办法没想出来

看到代码随想录之后的想法

        对于第i天的股票,有两种状态

        1 买入状态

                1 之前就买入

                2 第i天买入

        2 卖出状态

                1 之前就卖出

                2 第i天卖出

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

        int dp[i][2]

        dp[i][0]:代表第i天持有股票的最大现金

        dp[i][1]:代表卖出后的值,第i天不持有股票的最大现金 

        确定递推公式

        若当天买入 则为 dp[i-1][1]-price[i],

        若当天买入,则之前未买入,将之前未买入的现金来进行买入操作dp[i-1][1]-price[i]
        dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]-price[i])

        若当天卖出,则之前买入过,则为dp[i-1][0]+price[i]

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

       dp数组初始化

        dp[0][0]=-price[0]

        dp[0][1] = 0

        确定遍历顺序

        从前往后

        举例推导dp数组

                

自己实现过程中遇到的困难

        过程比较绕需要再消化一下

        dp的定义和赋值

class Solution {public int maxProfit(int[] prices) {//贪心 如果后面的比前面的要大,则加上/*int sum=0;for(int i=0;i<prices.length-1;i++){if(prices[i]<prices[i+1]){sum+=(prices[i+1]-prices[i]);}}return sum;*///确定dp数组以及每个下标的含义//和上一题一样  //dp[i][0] 表示第i天持有股票所得现金。//dp[i][1] 表示第i天不持有股票所得最多现金//确定递推公式()//第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]//第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]// 和上一题的区别,若第i天买入股票,则需要用昨天不持有股票的现金去买,dp[i-1][1]-price[i]// 若第i天不买入股票,则取上一天的值// 若第i天卖出股票,// 当前是持有股票的状态,则dp[i][1] = dp[i-1][0]+price[i]// (不用累加上一次卖出股票的现金吗?不用,这里考虑的是上一次持有股票的状态卖出后的结果)// 若第i天不卖出股票,则dp[i][1] = dp[i-1][1]//dp数组初始化//dp[0][0]=-price[0],dp[0][1]=0//确定遍历顺序//从前往后//举例推导dp数组int[][] dp = new int[prices.length][2];dp[0][0] = -prices[0];dp[0][1] = 0;for(int i=1;i<prices.length;i++){//当天买入,则看之前没买入dp[i-1][1]-price[0]dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);//当天卖出,则看之前买入的值dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);}return dp[prices.length-1][1];}
}

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

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

相关文章

从JavaScript的角度上讲解一下xml

- XML&#xff08;可扩展标记语言&#xff09; XML&#xff08;可扩展标记语言&#xff09;是一种被设计用于存储和传输结构化数据的标记语言。它与HTML相似&#xff0c;但XML并没有预定义的标签&#xff0c;可以自定义标签及其属性。从JavaScript的角度来看&#xff0c;XML可以…

弟12章 网络编程

文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165TCP服务器端代码的编写 p166TCP服务器端流程 TCP客户端代码的编写 p167TCP客户端流程主机和客户端的通信流程 tcp多次通信服务器端代码 p168TCP多次通信客户端代码 p169UDP的一次双向通信 p170udp通信模型udp接收方代码u…

Git核心知识总结

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 工具教程 ✨特色专栏&#xff1a; MyS…

BASE64DecodedMultipartFile.base64ToMultipart的使用

BASE64DecodedMultipartFile.base64ToMultipart是一个方法&#xff0c;用于将Base64字符串转换为MultipartFile类型的文件。使用该方法的步骤如下&#xff1a; 1. 首先&#xff0c;确保你已经导入了BASE64DecodedMultipartFile类。2. 将Base64字符串作为参数传递给base64ToMult…

车辆行驶控制运动学模型的matlab建模与仿真,仿真输出车辆动态行驶过程

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 基本假设 4.2 运动学方程 5.完整工程文件 1.课题概述 车辆行驶控制运动学模型的matlab建模与仿真,仿真输出车辆动态行驶过程. 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a .…

【HarmonyOS】消息通知场景的实现

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

adb 常用命令汇总

目录 adb 常用命令 1、显示已连接的设备列表 2、进入设备 3、安装 APK 文件到设备 4、卸载指定包名的应用 5、从设备中复制文件到本地 6、将本地文件复制到设备 7、查看设备日志信息 8、重启设备 9、截取设备屏幕截图 10、屏幕分辨率 11、屏幕密度 12、显示设备的…

Open3D 点云的移动

可以按照x,y,z 方向移动 translation_vectornp.array([-68,0,0]) pcd_ pcd.translate(translation_vector)

Druid连接池报错

网上各种方法都试了&#xff0c;基本都不行&#xff0c;后来改了一下jar包版本&#xff0c;也就是第四点&#xff0c;才解决。 1、druid.properties文件位置 我学的时候说的是任意位置都行&#xff0c;除了web目录下&#xff0c;但是我试的时候必须要放在resources 文件夹下。…

什么是设计模式(第7章笔记)

目录 一、什么是设计模式 二、设计模式概要 1、名称 2、问题 3、解决方案 4、效果 三、《设计模式》的结构 四、小结 一、什么是设计模式 设计模式&#xff1a;是对已经分析过的问题&#xff0c;以及相关问题解决方案的优秀实践&#xff1b; 1、同样的问题总是重复出现&…

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(5)登录认证

指路&#xff08;1&#xff09;&#xff08;2&#xff09;&#xff08;3&#xff09;&#xff08;4&#xff09;&#x1f447; 黑马程序员JavaWeb开发|案例&#xff1a;tlias智能学习辅助系统&#xff08;1&#xff09;准备工作、部门管理_tlias智能学习辅助系统的需求分析-CS…

python学习笔记10(选择结构2、循环结构1)

&#xff08;一&#xff09;选择结构2 1、if……else……语句 #&#xff08;1&#xff09;基本格式 numbereval(input("请输入您的6位中奖号码&#xff1a;")) if number123456:print("恭喜您&#xff0c;中奖了") else:print("未中奖")#&…

案例学Python:filter()函数的用法,高级!

大家好&#xff0c;这里是程序员晚枫&#xff0c;又来分享有用的Python知识了。 Python之所以好用&#xff0c;是因为有大量用于科学计算的内置函数和第三方库。用好这些第三方库&#xff0c;可以显著提高我们编程的速度和质量。 今天我们一起来看一下Python中一个重要的内置…

2024美赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

深度解析JVM类加载器与双亲委派模型

概述 Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的核心&#xff0c;其中类加载器和双亲委派模型是JVM的重要组成部分。本文将深入讨论这两个概念&#xff0c;并解释它们在实际开发中的应用。 1. 什么是类加载器&#xff1f; 类加载器是JVM的一部分&#xff0c;负…

java-Lambda 语法总结

文章目录 Lambda 语法概览Lambda 表达式语法1.Lambda 表达式与函数接口2.Lambda 遇上 this final Lambda 语法概览 String(] names {”Justi n ”,”caterpillar”,”Bush " }; Arrays . sort (names, new Compara tor<String> () { publ int compare (String na…

pytorch12:GPU加速模型训练

目录 1、CPU与GPU2、数据迁移至GPU2.1 to函数使用方法 3、torch.cuda常用方法4、多GPU并行运算4.1 torch.nn.DataParallel4.2 torch.distributed加速并行训练 5、gpu总结 往期回顾 pytorch01&#xff1a;概念、张量操作、线性回归与逻辑回归 pytorch02&#xff1a;数据读取Data…

WordPress企业模板

首页大图wordpress外贸企业模板 橙色的wordpress企业模板 演示 https://www.zhanyes.com/waimao/6250.html

鸿蒙原生应用/元服务开发-代理提醒开发步骤(二)

1.申请ohos.permission.PUBLISH_AGENT_REMINDER权限。 2.使能通知开关。获得用户授权后&#xff0c;才能使用代理提醒功能。 3.导入模块。 import reminderAgentManager from ohos.reminderAgentManager; import notificationManager from ohos.notificationManager;4.定义目…

【算法Hot100系列】全排列

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…