代码随想录算法训练营 Day 49 | 121.买卖股票的最佳时机,122.买卖股票的最佳时机 II

news/2025/2/13 0:15:45/

121.买卖股票的最佳时机

讲解链接:代码随想录-121.买卖股票的最佳时机

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

    1. dp[i][0] 表示第 i 天持有股票所得最多现金
    2. dp[i][1] 表示第 i 天不持有股票所得最多现金
  2. 确定递推公式:

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

      1. 第 i-1 天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
      2. 第 i 天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]
      3. 那么 dp[i][0]应该选所得现金最大的,所以 dp[i][0] = max(dp[i - 1][0], -prices[i]);
    2. 如果第 i 天不持有股票即 dp[i][1], 也可以由两个状态推出来

      1. 第 i-1 天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
      2. 第 i 天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]
      3. 同样 dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
  3. dp 数组如何初始化

    1. dp[0][0]表示第 0 天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以 dp[0][0] -= prices[0];​​
    2. dp[0][1]表示第 0 天不持有股票,不持有股票那么现金就是 0,所以 dp[0][1] = 0;​​
  4. 确定遍历顺序

    1. 从递推公式可以看出dp[i]都是由dp[i - 1]推导出来的,那么一定是从前向后遍历。
public int maxProfit(int[] prices) {int len = prices.length;int[][] dp = new int[len][2];dp[0][0] -= prices[0];dp[0][1] = 0;for (int i = 1; i < len; i++) {dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);}return dp[len - 1][1];
}

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

讲解链接:代码随想录-122.买卖股票的最佳时机 II

public int maxProfit(int[] prices) {int len = prices.length;int[][] dp = new int[len][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[len - 1][1];
}

http://www.ppmy.cn/news/74771.html

相关文章

六、数据仓库详细介绍(ETL)工具篇下

0x00 前言 上篇&#xff0c;我们介绍了五种传统 ETL 工具和八种数据同步集成工具。 数据仓库详细介绍&#xff08;五.ETL&#xff09;工具篇上 本篇&#xff0c;我们接着介绍两种新型 ETL 工具、大数据发展不同阶段产生的六种主要计算引擎、五种流程控制组件。 最后我们简单…

手写Docker之认识NameSpace、CGroups、Union file system

关于NameSpace Linux NameSpace主要是kernel中用于隔离系统资源的功能&#xff0c;而docker就是基于NameSpace去隔离系统资源达到容器化的效果 以下案例均以该代码进行举例&#xff1a; package mainimport ("fmt""os""os/exec""syscall&…

1057 Stack (PAT甲级)

用了《算法笔记》中分块的思路。 #include <iostream> #include <string> #include <vector> #include <cstdio> #include <cmath> const int MAXN 100001;int main(){int N, sz, nbrOfBlock, t, cnt, j;int count[MAXN] {0};sz sqrt(MAXN *…

OKR是什么意思啊

一、OKR是什么意思&#xff1f; OKR是"Objective and Key Results"的缩写&#xff0c;即目标和关键结果。它是一种目标管理框架&#xff0c;旨在帮助组织和团队设定明确的目标&#xff0c;并通过关键结果来衡量和追踪目标的实现情况。 为了让大家快速了解什么是OKR…

ResourceManager启动报错:Queue configuration missing child queue names for root【已解决】

Queue configuration missing child queue names for root 现象报错分析ResourceManager输出日志解决 现象 start-all.sh后缺少RM的进程 报错 查看启动日志输出文件 2023-05-23 19:28:19,863 INFO [main] resourcemanager.RMNMInfo (RMNMInfo.java:<init>(63)) - Re…

UNIX网络编程卷一 学习笔记 第十五章 Unix域协议

本书中&#xff0c;作者说Unix域数据报套接字是不可靠的&#xff0c;这一说法已经过时&#xff0c;当前大多实现中&#xff0c;Unix域套接字都是可靠的&#xff0c;不论是数据报套接字还是字节流套接字。 Unix域协议不是一个实际的协议族&#xff0c;而是单个主机上执行客户/服…

ROS学习(3)——CMakeLists文件的编写

学会CMakeLists文件编写是学习ros一个很重要的知识&#xff0c;但是因为每个人编写的CMakeLists不同&#xff0c;当初学习的时候我查了很多学习资料发现依旧很难入门&#xff0c;所以现在准备详细全面的介绍一下CMakeLists里面包含哪些内容&#xff0c;如何根据自己的项目编写自…

3D点云数据转为俯瞰图Python实现代码

我主要是参考了英文博客来撰写本篇文章&#xff0c;仅作为个人学习笔记参考使用。 文章目录 一、点云数据二、图像与点云坐标三、创建点云数据的鸟瞰视图3.1 鸟瞰图的相关坐标轴3.2 限制点云数据范围3.3 将点位置映射到像素位置3.4 切换到新的零点3.5 像素值3.6 创建图像矩阵3.…