当前位置: 首页 > news >正文

代码随想录动态规划 || 121 122

Day42

121. 买卖股票的最佳时机

力扣题目链接

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

思路

  • 贪心算法:遍历一遍数组,计算每次 到当天为止 的最小股票价格和最大利润

  • 动态规划

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

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

  • 最开始资金是0,什么时候买了股票,就扣除prices[i]

  • 第i天持有股票,可能是i - 1就有股票,也可能是之前没有(资金为0)第i天买入dp[i] [0] = max(dp[i - 1] [0], -prices[i])

  • 第i天不持有股票,可能是i - 1没有股票,i没买;也可能是i - 1有股票,i卖出去了 dp[i] [1] = max(dp[i - 1] [1], dp[i - 1] [0] + prices[i])

  • dp[0] [0] = -prices[0], dp[0] [1] = 0

代码

class Solution {public int maxProfit(int[] prices) {int low = Integer.MAX_VALUE;int res = 0;for (int i = 0; i < prices.length; i++) {low = Math.min(low, prices[i]);//记录到第i天的最低价格res = Math.max(res,prices[i] - low);//同时可以计算出来到i天的最大利润}return res;}
}class Solution1 {public int maxProfit(int[] prices) {int[][] dp = new int[prices.length][2];dp[0][0] = -prices[0];//初始化dp数组dp[0][1] = 0;for (int i = 1; i < prices.length; i++){dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);//第i天有股票dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);//第i天没股票}return dp[prices.length - 1][1];}
}

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

力扣题目链接

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

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

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

思路

  • 动态规划

  • 和上一题的区别是,股票可以多次买入卖出,因此在i时刻持有股票,可能是i - 1就有股票i的时候没有卖,也可能是i - 1的时候没有股票i的时候买入了

  • 什么是i - 1没有股票?上一题是股票只能买一次,这题是可以多次购买卖出,因此没有股票的时候手里的钱不一定是0

代码

class Solution {public int maxProfit(int[] prices) {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], 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.lryc.cn/news/39315.html

相关文章:

  • C++STL库中不可或缺的部分—string(模拟实现)
  • MySQL复合查询
  • PCIe 资料收集2
  • Linux网络编程(使用VScode远程登录ubuntu)
  • 如何提高项目估算精准度?关键看5大影响因子
  • 论文阅读笔记《Nctr: Neighborhood Consensus Transformer for Feature Matching》
  • 上位机系统Ubuntu 20.04与下位机arduino UNO通讯
  • hive面试题
  • 【CUDA】《CUDA编程:基础与实践》CUDA加速的关键因素
  • 数据结构【Golang实现】(四)——双向循环链表
  • 【Redis】高可用架构之哨兵模式 - Sentinel
  • 图片的美白与美化
  • 面试官:关于CPU你了解多少?
  • UI自动化测试-Selenium的使用
  • 嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置
  • Android setContentView流程分析(一)
  • doris数据库操作数字遇到的问题
  • 3.13文件的IO操作
  • ffmpeg使用
  • spark中的并行度(分区数)/分区器如何确定
  • 00后女生“云摆摊”两周赚1.5万,实体店转战线上真的能赚钱吗?
  • 华为OD机试题 - 最优资源分配(JavaScript)| 机考必刷
  • 利用python判断字符串是否为回文
  • GDB 调用之ptype、set variable
  • 并发编程---阻塞队列(五)
  • 本科课程【计算机组成原理】实验1 - 输出ABCD程序的生成
  • Java并发编程(2) —— 线程创建的方式与原理
  • 你写的js性能有多差你知道吗 | js性能优化
  • 线程的状态、状态之间的相互转换
  • Java8使用Lambda表达式(流式)快速实现List转map 、分组、过滤等操作