力扣刷题记录10.10
Last updated on October 10, 2024 pm
今天主要复习动态规划
二、2024/10/10
(1)一维动态规划
爬楼梯和打家劫舍秒了😘(再不秒也别学了)
1、单词拆分
给你一个字符串
s和一个字符串列表wordDict作为字典。如果可以利用字典中出现的一个或多个单词拼接出s则返回true。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
1 | |
这道题的思路有点超纲吧!!!!!
这个动态规划的意思是,首先外循环是到单词的第i个字符,然后想要判断前i个字符能否通过字典中的单词拼出。内循环就是让j从0开始,一直到第i个字符,如果前j个字符能通过字典拼出来,而且第j到i个字符组成的字符串也能在字典中找到,那么就说明前i个字符能通过字典拼出。于是依此类推。
重点:
- 初始化动态规划数组的时候,0代表前零个字符,1才是代表一个字符。dp[0]是一定要初始化为true的,这点很关键。
- 使用
unordered_set是为了使得搜索更快,降低时间复杂度。
2、杨辉三角
给定一个非负整数
numRows,生成「杨辉三角」的前numRows行。
首先欣赏一下官方的解法:
1 | |
- 初始化结果容器:定义二维数组,numRows行,我们会逐行填充。
- 遍历:设置每一行的大小并填充边界元素;根据上一行填充中间元素
再看看我的狗屎一样的解法。。。。。为什么官方的这么优美
1 | |
3、完全平方数
给你一个整数
n,返回 和为n的完全平方数的最少数量 。
1 | |
首先初始化动态规划数组,依旧是遍历0->n;初始化时f[0]=0;
f[i]表示可以将整数i表示为平方数的最小数量
内层循环,枚举所有小于等于i的完全平方数,并找到所有可能的f[i-j*j]的最小值。f[i-j*j]表示i减去一个完全平方数后剩余部分所需要的最少数量,并维护最小值。
f[i]=minn+1,因为减掉了j*j。
4、零钱兑换
为什么这道题做了无数遍还记不住。。
给你一个整数数组
coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。
1 | |
动态规划的核心是通过子问题的最优解构造出整个问题的最优解。在这个问题中,我们可以设定一个状态 dp[i],表示凑成金额 i 需要的最少硬币数。
1、状态定义
dp[i]表示凑成金额i所需的最少硬币数。- 目标是求解
dp[amount]。
2、转移方程
- 对于每个金额
i,我们可以通过使用一个面值为coins[j]的硬币,来从金额i - coins[j]转移到i。 - 也就是说,如果要凑出金额
i,我们可以从i - coins[j]的金额开始,再加上一个面值为coins[j]的硬币。 - 因此,状态转移方程为:
dp[i]=min(dp[i],dp[i−coins[j]]+1),其中dp[i - coins[j]]是凑出金额i - coins[j]需要的最少硬币数,+1表示我们使用了一个面值为coins[j]的硬币。
3、初始状态
- 如果金额为
0,则不需要硬币,因此dp[0] = 0。
4、无法凑出某个金额的处理
- 如果某个金额无法凑出,我们将
dp[i]设为一个大于amount的值,这样在最后判断dp[amount]时可以得出无法凑出的结论。
(2)多维动态规划
1、不同路径
一个机器人位于一个
m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?
竟然,许久未见我居然做出来了哈哈哈哈哈哈哈哈哈哈哈哈(狂笑)
2、最小路径和
给定一个包含非负整数的
*m* x *n*网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。
(3)中心拓展法
1、最长回文子串
给你一个字符串
s,找到s中最长的 回文子串。
1 | |
本题顾名思义,使用中心扩展法解决,则首先需要确定中心点,很容易思考得出一共有两种中心:一个字符和两个字符。
外层循环遍历中心点的位置,内层循环是确定是哪种中心。
当字符匹配时,l、r相应增减。直到不匹配为止,然后l、r需要回溯一位到回文串边界。
由l、r来确定回文串的起始位置和长度,并维护一个最大长度和相应的起始位置。
使用substring方法返回最长回文串。