2025高频面试算法总结篇【动态规划】
文章目录
- 直接刷题链接直达
- 编辑距离
- 最长回文子串
- 完全平方数
- 最长递增子序列
- 正则表达式匹配
- 零钱兑换
- 鸡蛋掉落
- 单词拆分
直接刷题链接直达
动态规划(Dynamic Programming, DP)是一种通过拆解子问题并利用子问题的最优解来构建整体问题的最优解的方法,通常用于具有重叠子问题和最优子结构的优化问题。
- 最优子结构:一个问题的最优解包含其子问题的最优解。例如,最短路径问题,求从A到B的最短路径,其中A到C和C到B的最短路径也必须是最优的。
- 重叠子问题:相同的子问题在递归过程中会被多次计算。例如,斐波那契数列
F(n) = F(n-1) + F(n-2),计算F(n-2)时也需要计算F(n-3)。
如果问题满足这两个特性,通常可以考虑使用动态规划。
(1)状态的定义是解决动态规划的关键。通常可以通过以下方式思考:
- 分析问题,找出“规模较小”的子问题。
- 确定状态变量,这些变量应该能唯一标识一个子问题的情况。
- 一般来说,状态变量的选取往往与问题的输入参数有关。
- 例如,背包问题中
dp[i][j]表示前i个物品,在总容量为j的背包中的最优解。 - 在最长公共子序列问题中
dp[i][j]表示s1的前i个字符和s2的前j个字符的最长公共子序列长度。
(2)状态转移方程用于描述如何从较小的子问题递推到较大的子问题。常见的方法:
- 考虑决策过程:在某个状态下,可以有哪些选择?
- 根据子问题的解构建当前问题的解。
例如:
- 斐波那契数列:
dp[n] = dp[n-1] + dp[n-2] - 0/1 背包问题:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])(取或者不取当前物品)
(3)初始状态是动态规划表 dp 的起点,通常根据问题的边界条件来确定。例如:
- 斐波那契数列:
dp[0] = 0, dp[1] = 1 - 背包问题:
dp[0][j] = 0(没有物品可选时,价值均为0)
(4)动态规划可以通过**自顶向下(带记忆化的递归)或自底向上(迭代)**来实现:
- 自顶向下:递归 + 记忆化搜索(Memoization),避免重复计算
- 自底向上:直接从小规模问题开始填表,通常是
O(n)或O(n^2)
- 最佳折扣问题
- double calculateMinPrice(int [] counts, double [] prices, Map<int[], Double> promotions)
- counts表示一个要买的商品数量列表(如0011表示第3件和第4件都买一个),prices表示单价,promotions表示折扣表 比如 0011->9 表示第3件和第4件一起打包买打9折,输出一个最低价格
- 实现类似 动态规划_最小费用购物问题
- 设计一个模糊匹配算法,给定一个字符串列表和一个字符串,输出列表中最匹配的那个(若都不匹配可输出空串)
- 类似于 72. 编辑距离,基于字符长度配置好阈值
- 最长回文子串
- 5. 最长回文子串
- 完全平方数
- 279. 完全平方数
- 最长递增子序列
- 300. 最长递增子序列
- 正则表达式匹配
- 10. 正则表达式匹配
- 零钱兑换
- 322. 零钱兑换
- 鸡蛋掉落
- dp[K] [N] = 1 + max(dp[K - 1] [i - 1] + dp[K] [N - i]) + 1 (i~(1,N)) (K蛋N层,最直观的DP,还有其他解法)
- 887. 鸡蛋掉落
- Egg Dropping Dynamic Programming (画状态转移表)
- 单词拆分
- 139. 单词拆分
- 140. 单词拆分 II
编辑距离
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
class Solution {// dp[i][j] : word1[0:i]转换成 word2[0:j] 所使用的最少操作数// dp[i][j] = (s[i] == s[j] && dp[i-1][j-1]) or (Math.min(插删替换))public int minDistance(String word1, String word2) {int m = word1.length(), n = word2.length();int[][] dp = new int[m+1][n+1];// 初始 dp[0][j] = j; dp[i][0] = i;for (int i = 0; i <= m; i++) {dp[i][0] = i;} for (int j = 0; j <= n; j++) {dp[0][j] = j;}//for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i-1) == word2.charAt(j-1)) {dp[i][j] = dp[i-1][j-1];}else {dp[i][j] = Math.min(Math.min(dp[i][j-1], dp[i-1][j]),dp[i-1][j-1])+1;}}}return dp[m][n];}
}
最长回文子串
给你一个字符串 s,找到 s 中最长的 回文 子串。
class Solution {// dp[i][j] s[i-j] 是否为回文串public String longestPalindrome(String s) {if (s.length() <= 1) return s;boolean[][] dp = new boolean[s.length()][s.length()];for (int i = 0; i < s.length(); i++) {dp[i][i] = true;}int start = 0, maxlen = 1;for (int len = 2; len <= s.length(); len++) {for (int i = 0; i <= s.length() - len; i++) {int j = i + len - 1;if (len == 2 && s.charAt(i) == s.charAt(j)) {dp[i][j] = true;}else {dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i+1][j-1];}if (dp[i][j] && len > maxlen) {start = i;maxlen = len;}}}return s.substring(start, start+maxlen);}
}
完全平方数
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
class Solution {// dp[i] = dp[i-完全平方数]+1public int numSquares(int n) {int[] dp = new int[n+1];Arrays.fill(dp, Integer.MAX_VALUE);dp[0] = 0;for (int i = 1; i <= n; i++){for (int j = 1; j*j <= i; j++) {dp[i] = Math.min(dp[i], dp[i-j*j]+1);}}return dp[n];}
}
最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
class Solution {public int lengthOfLIS(int[] nums) {// dp[i] 以i结尾 的 最长严格递增子序列的长度int[] dp = new int[nums.length];Arrays.fill(dp, 1);int max = 1;for (int i = 1; i < nums.length; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}max = Math.max(max, dp[i]);}return max;}
}
正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。
class Solution {public boolean isMatch(String s, String p) {int n = s.length();int m = p.length();boolean[][] dp = new boolean[n + 1][m + 1];// 空字符串匹配空模式dp[0][0] = true;// 处理 p[j-1] 是 '*' 的情况 (匹配 0 次)for (int j = 2; j <= m; j++) {if (p.charAt(j - 1) == '*') {dp[0][j] = dp[0][j - 2]; }}// 填充 DP 数组for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (p.charAt(j - 1) == '.' || p.charAt(j - 1) == s.charAt(i - 1)) {dp[i][j] = dp[i - 1][j - 1];} else if (p.charAt(j - 1) == '*') {dp[i][j] = dp[i][j - 2]; // `*` 匹配 0 次if (p.charAt(j - 2) == s.charAt(i - 1) || p.charAt(j - 2) == '.') {dp[i][j] = dp[i][j] || dp[i - 1][j]; // `*` 匹配多次}}}}return dp[n][m];}
}
零钱兑换
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。
class Solution {public int coinChange(int[] coins, int amount) {// dp[i] :可以凑成 i 所需的 最少的硬币个数 int[] dp = new int[amount+1];// dp[i] = dp[i-coins] + 1Arrays.fill(dp, amount + 1);dp[0] = 0;Arrays.sort(coins);for (int coin : coins) {if (coin <= amount) {dp[coin] = 1;}else {break;}}for (int i = 1; i <= amount; i++) {for (int coin : coins) {if (coin > i) {break;}dp[i] = Math.min(dp[i], dp[i-coin]+1);}}return dp[amount] >= amount + 1 ? -1:dp[amount];}
}
鸡蛋掉落
单词拆分
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
class Solution {// dp[i] 表示 s[0:i] 是否可以拆分成 wordDict 里的单词组合。// dp[i]=dp[j] 且 s[j:i] 在 wordDictpublic boolean wordBreak(String s, List<String> wordDict) {boolean[] dp = new boolean[s.length()+1];dp[0] = true;for(int i = 1; i <= s.length(); i++) {for (int j = 0; j <= i; j++) {if (dp[j] && wordDict.contains(s.substring(j, i))) {dp[i] = true;break;}}}return dp[s.length()];}
}
相关文章:
2025高频面试算法总结篇【动态规划】
文章目录 直接刷题链接直达编辑距离最长回文子串完全平方数最长递增子序列正则表达式匹配零钱兑换鸡蛋掉落单词拆分 直接刷题链接直达 动态规划(Dynamic Programming, DP)是一种通过拆解子问题并利用子问题的最优解来构建整体问题的最优解的方法&#x…...
Maven中clean、compil等操作介绍和Pom.xml中各个标签介绍
文章目录 前言Maven常用命令1.clean2.vaildate3.compile4.test5.package6.verify7.install8.site9.deploy pom.xml标签详解格式<?xml version"1.0" encoding"UTF-8"?>(xml版本和编码)modelVersion(xml版本)groupIdÿ…...
力扣刷题-热题100题-第35题(c++、python)
146. LRU 缓存 - 力扣(LeetCode)https://leetcode.cn/problems/lru-cache/?envTypestudy-plan-v2&envIdtop-100-liked 双向链表哈希表 内置函数 对于c有list可以充当双向链表,unordered_map充当哈希表;python有OrderedDic…...
Nautilus 正式发布:为 Sui 带来可验证的链下隐私计算
作为 Sui 安全工具包中的强大新成员,Nautilus 现已上线 Sui 测试网。它专为 Web3 开发者打造,支持保密且可验证的链下计算。Nautilus 应用运行于开发者自主管理的可信执行环境(Trusted Execution Environment,TEE)中&a…...
云服务器CVM标准型S5实例性能测评——2025腾讯云
腾讯云服务器CVM标准型S5实例具有稳定的计算性能,CPU采用采用 Intel Xeon Cascade Lake 或者 Intel Xeon Cooper Lake 处理器,主频2.5GHz,睿频3.1GHz,CPU内存配置2核2G、2核4G、4核8G、8核16G等配置,公网带宽可选1M、3…...
优化方法介绍(二)——BFGS 方法介绍
优化方法介绍(二) 本博客是一个系列博客,主要是介绍各种优化方法,使用 matlab 实现,包括方法介绍,公式推导和优化过程可视化 1 BFGS 方法介绍 BFGS 的其实就是一种改良后的牛顿法,因为计算二阶导数 Hessian 矩阵所需的计算资源是比较大的,复杂度为 O ( 2 ⋅ n 2 ) …...
leetcode面试经典算法题——2
链接:https://leetcode.cn/studyplan/top-interview-150/ 20. 有效的括号 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足&#x…...
Ubuntu20.04安装企业微信
建议先去企业微信官网看一下有没有linux版本,没有的话在按如下方式安装,不过现在是没有的。 方案 1、使用docker容器 2、使用deepin-wine 3、使用星火应用商店 4. 使用星火包deepin-wine 5、使用ukylin-wine 本人对docker不太熟悉,现…...
在Ubuntu服务器上部署xinference
一、拉取镜像 docker pull xprobe/xinference:latest二、启动容器(GPU) docker run -d --name xinference -e XINFERENCE_MODEL_SRCmodelscope -p 9997:9997 --gpus all xprobe/xinference:latest xinference-local -H 0.0.0.0 # 启动一个新的Docker容…...
异步编程——微信小程序
1. 前言 引用来自:微信小程序开发中的多线程处理与异步编程_微信小程序 多线程-CSDN博客 微信小程序是基于JavaScript开发的,与浏览器JavaScript不同,小程序运行在WebView内部,没有多线程的概念。小程序的 JavaScript 是单线程的…...
Hive null safe的用法
总结: null safe 是用<> 代表比较,而不是用 。null <> null 返回 true, 而 null null 代表 false。 NULL 和任意字符比较都返回 NULL,而不是 true 或者 false。如 SELECT 1 1, NULL NULL, 1 NULL;输出 true NULL NULL如果我…...
STM32 四足机器人常见问题汇总
文章不介绍具体参数,有需求可去网上搜索。 特别声明:不论年龄,不看学历。既然你对这个领域的东西感兴趣,就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题:提出问题时,应说明是哪款产品&a…...
鸿蒙NEXT开发文件预览工具类(ArkTs)
import { uniformTypeDescriptor } from kit.ArkData; import { filePreview } from kit.PreviewKit; import { FileUtil } from ./FileUtil; import { AppUtil } from ./AppUtil; import { WantUtil } from ./WantUtil;/*** 文件预览工具类* 提供文件预览、加载、判断等功能。…...
Windows 下实现 PHP 多版本动态切换管理(适配 phpStudy)+ 一键切换工具源码分享
🚀 Windows 下实现 PHP 多版本动态切换管理(适配 phpStudy) 一键切换工具源码分享 📦 工具特点🧪 效果展示🧱 环境要求🧑💻 源码展示:php_switcher.py🛠 打…...
ReportLab 导出 PDF(图文表格)
ReportLab 导出 PDF(文档创建) ReportLab 导出 PDF(页面布局) ReportLab 导出 PDF(图文表格) 文章目录 1. Paragraph(段落)2. Table(表格)3. VerticalBarChart࿰…...
【Kubernetes基础--Service深入理解】--查阅笔记4
目录 Service 的用法docker 对外提供服务service 对外提供服务 从集群外部访问 Pod 或 Service将容器应用的端口号映射到物理机将 Service 的端口号映射到物理机 Ingress:HTTP 7层路由机制创建Ingress Controller和默认的backend服务 k8s 通过创建 Serviceÿ…...
蓝桥杯 5. Excel地址
原题目链接 题目描述 Excel 单元格的地址表示很有趣,它使用字母来表示列号。例如: A 表示第 1 列B 表示第 2 列...Z 表示第 26 列AA 表示第 27 列AB 表示第 28 列BA 表示第 53 列... Excel 的最大列号是有限的,但本题将这种表示法一般化&…...
yolov8复现
Yolov8的复现流程主要包含环境配置、下载源码和验证环境三大步骤: 环境配置 查看电脑状况:通过任务管理器查看电脑是否有独立显卡(NVIDIA卡)。若有,后续可安装GPU版本的pytorch以加速训练;若没有࿰…...
C#学习第15天:泛型
什么是泛型? 定义:泛型允许您在类、接口和方法中定义占位符,这些占位符在使用时可以指定为具体的类型。作用:通过减少重复代码和提供更强的类型检查,提高了代码的可重用性和性能。 泛型的核心概念 1.泛型类 泛型类能…...
WPF ObjectDataProvider
在 WPF(Windows Presentation Foundation)中,ObjectDataProvider 是一个非常有用的类,用于将非 UI 数据对象(如业务逻辑类或服务类)与 XAML 绑定集成。它允许在 XAML 中直接调用方法、访问属性或实例化对象,而无需编写额外的代码。以下是关于 ObjectDataProvider 的详细…...
Windows系统安装RustDesk Server的详细步骤和客户端设置
Windows系统安装RustDesk Server的详细步骤 在Windows系统上安装RustDesk Server涉及几个关键步骤,包括安装必要的依赖、下载RustDesk Server程序、配置并启动服务。以下是详细的步骤: 1. 安装Node.js和PM2 RustDesk Server的某些版本可能需要Node.js环境来运行,而PM2是一…...
RestSharp和Newtonsoft.Json结合发送和解析http
1.下载RestSharp和Newtonsoft.Json 2编写ApiRequest和ApiResponse和调用工具类HttpRestClient 请求模型 /// <summary>/// 请求模型/// </summary>public class ApiRequest{/// <summary>/// 请求地址/api路由地址/// </summary>public string Route {…...
《基于 RNN 的股票预测模型代码优化:从重塑到直接可视化》
在深度学习领域,使用循环神经网络(RNN)进行股票价格预测是一个常见且具有挑战性的任务。本文将围绕一段基于 RNN 的股票预测代码的改动前后差别展开,深入剖析代码的优化思路和效果。 原始代码思路与问题 原始代码实现了一个完整…...
【Pytorch之一】--torch.stack()方法详解
torch.stack方法详解 pytorch官网注释 Parameters tensors:张量序列,也就是要进行stack操作的对象们,可以有很多个张量。 dim:按照dim的方式对这些张量进行stack操作,也就是你要按照哪种堆叠方式对张量进行堆叠。dim的…...
半导体设备通信标准—secsgem v0.3.0版本使用说明文档(3)之SECS(SEMI E4,SEMI E5)
文章目录 1、变量1.1、数组类型1.2、获取数据1.3、设置数据1.4、编码/解码1.5、Array1.6、List1.7、动态变量 2、Items2.1、 Item types2.2、 Creating items2.1.1、 From value2.1.2、From SML text2.1.3、 From protocol text 2.3、 Getting data2.3.1、 Python value2.3.2、…...
数据中台(大数据平台)之数据资源目录
数据资源目录是数据管理的账本,是数据应用的基础,更是是数据治理成果的体现,因此数据中台产品应提供数据资源目录编制、发布、资源挂载、下架的管理能力。 1.数据资源目录分类 资源目录能够支持基于业务特点创建和维护基础目录分类和特色目…...
【随身WiFi】随身WiFi Debian系统优化教程
0.操作前必看 本教程基于Debian系统进行优化,有些操作对随身WiFi来说可能会带来负优化,根据需要选择。 所有操作需要在root用户环境下运行,否则都要加sudo 随身wifi Debian系统,可以去某安的随声WiFi模块自行搜索刷机 点赞&am…...
【WORD】批量将doc转为docx
具体步骤进行: 打开Word文档,按下AltF11快捷键,打开VBA编辑器。在VBA编辑器中,左侧的“项目资源管理器”窗口会显示当前打开的Word文档相关项目。找到您要添加代码的文档项目(通常以文档名称命名)…...
JAVA Web_定义Servlet2_学生登录验证Servlet
题目 页面StudentLogin.html中有一HTML的表单代码如下: <form action"studentLogin" method"post">学生姓名:<input type"text" name"stuName" value""><br>登录密码:…...
深入理解设计模式之模板方法模式 1d87ab8b42e98069b6c2c5a3d2710f9a
深入理解设计模式之模板方法模式 深入理解设计模式之模板方法模式 在软件开发的漫长征程中,我们常常会遇到各种复杂的业务逻辑,其中部分逻辑具有相似的流程框架,但在具体细节上又有所不同。这种情况下,模板方法模式就如同一位得…...
