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

【算法刷题】Day28

文章目录

  • 1. 买卖股票的最佳时机 III
    • 题干:
    • 算法原理:
      • 1. 状态表示:
      • 2. 状态转移方程
      • 3. 初始化
      • 4. 填表顺序
      • 5. 返回值
    • 代码:
  • 2. Z 字形变换
    • 题干:
    • 算法原理:
      • 1. 模拟
      • 2. 找规律
    • 代码:

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

在这里插入图片描述
原题链接


题干:

第 i 个元素是一支给定的股票在第 i 天的价格
最多可以完成 两笔 交易
注意:你不能同时参与多笔交易
在这里插入图片描述


算法原理:

1. 状态表示:

在这里插入图片描述
dp[i] 表示:第 i 天结束之后,所能获得的最大利润

f[i][j] 表示:第 i 天结束之后,完成了 j 次交易,此时处于“买入”状态下的,最大利润
g[i][j] 表示:第 i 天结束之后,完成了 j 次交易,此时处于“卖出”状态下的,最大利润

2. 状态转移方程

在这里插入图片描述
f[i][j] = Math.max(f[i - 1][j], g[i - 1][j] - prices[i])

g[i][j] = g[i - 1][j]
if(j - 1 >= 0) {
g[i][j] = Math.max(g[i][j], f[i - 1][j - 1] + prices[i]);
}

3. 初始化

在这里插入图片描述
在这里插入图片描述

4. 填表顺序

从上往下填写每一行
每一行从左往右,两个表一起填

5. 返回值

g 表的最后一行里面的最大值


代码:

class Solution {public int maxProfit(int[] prices) {int n = prices.length;int INF = 0x3f3f3f3f;int[][] f = new int[n][3];int[][] g = new int[n][3];for(int j = 0; j < 3; j++) {f[0][j] = g[0][j] = -INF;}f[0][0] = -prices[0];g[0][0] = 0;for(int i = 1; i < n; i++) {for(int j = 0; j < 3; j++) {f[i][j] = Math.max(f[i - 1][j], g[i - 1][j] - prices[i]);g[i][j] = g[i - 1][j];if(j - 1 >= 0) {g[i][j] = Math.max(g[i][j], f[i - 1][j - 1] + prices[i]);}}}int ret = 0;for(int j = 0; j < 3; j++) {ret = Math.max(ret, g[n - 1][j]);}return ret;}
}

在这里插入图片描述


2. Z 字形变换

在这里插入图片描述
原题链接


题干:

字符串 s,给定的行数 numRows
从上往下、从左到右进行 Z 字形排列
输出需要从左往右逐行读取
在这里插入图片描述


算法原理:

1. 模拟

在这里插入图片描述

2. 找规律

在这里插入图片描述
第一行:0 到 0+d 到 0+2d…0+kd

第 k 行:(k, d-k) 到 (k+d, d-k+d) 到 (k+2d, d-k+2d)

第 n-1 行:n-1 到 n-1+d 到 n-1+2d…n-1+kd

当 n = 1 的时候特殊处理


代码:

class Solution {public String convert(String s, int numRows) {// 处理一下边界情况if(numRows == 1) {return s;}int d = 2 * numRows - 2;int n = s.length();StringBuilder ret = new StringBuilder();//1. 处理第一行for(int i = 0; i < n; i += d) {ret.append(s.charAt(i));}//2. 处理中间行for(int k = 1; k < numRows - 1; k++) {// 依次枚举中间行for(int i = k, j = d - i; i < n || j < n; j += d, i += d) {if(i < n) {ret.append(s.charAt(i));}if(j < n) {ret.append(s.charAt(j));}}}//3. 处理最后一行for(int i = numRows - 1; i < n; i += d) {ret.append(s.charAt(i));}return ret.toString();}
}

在这里插入图片描述

http://www.lryc.cn/news/277144.html

相关文章:

  • 深入了解pnpm:一种高效的包管理工具
  • QEMU源码全解析 —— PCI设备模拟(1)
  • Vue-10、Vue键盘事件
  • 胡圆圆的暑期实习经验分享
  • 基于uniapp封装的table组件
  • Git删除远程仓库某次提交记录后的所有提交
  • 强化学习10——免模型控制Q-learning算法
  • 【数据库】CRUD常用函数UNION 和 UNION ALL
  • Adding Conditional Control to Text-to-Image Diffusion Models——【论文笔记】
  • Python与人工智能
  • 【Docker】Docker基础
  • linux异常情况,排查处理中
  • Spring Boot参数校验方案
  • 【漏洞复现】ActiveMQ反序列化漏洞(CVE-2015-5254)
  • 面试题:MySQL误删表数据,如何快速恢复丢失的数据?
  • 李沐之神经网络基础
  • 【docker】使用 Dockerfile 构建镜像
  • 计算机网络—— 概述
  • “超人练习法”系列06:如何更好地掌握技能?
  • 【华为OD机试真题2023CD卷 JAVAJS】字符串拼接
  • 【算法】链表-20240109
  • 机器学习系列--R语言随机森林进行生存分析(2)
  • Flutter GetX 之 状态管理
  • e2studio开发磁力计LIS2MDL(1)----轮询获取磁力计数据
  • C++ 字符串大小写转换,替换,文件保存 方法封装
  • 计算机基础面试题 |19.精选计算机基础面试题
  • mysql 添加用户并分配select权限
  • 重新认识canvas,掌握必要的联结密码
  • Linux第21步_取消鼠标中键的复制粘贴功能
  • 数学建模-Matlab R2022a安装步骤