
力扣
力扣刷题
whxnchy
这个作者很懒,什么都没留下…
展开
-
935. 骑士拨号器
象棋骑士有一个,它可以垂直移动两个方格,水平移动一个方格,或者水平移动两个方格,垂直移动一个方格(两者都形成一个的形状)。象棋骑士可能的移动方式如下图所示:我们有一个象棋骑士和一个电话垫,如下所示,骑士(即蓝色单元格)。给定一个整数 n,返回我们可以拨多少个长度为 n 的不同电话号码。你可以将骑士放置在上,然后你应该执行 n - 1 次移动来获得长度为 n 的号码。所有的跳跃应该是的骑士跳跃。因为答案可能很大,109 + 7。原创 2024-02-24 16:37:34 · 412 阅读 · 0 评论 -
97. 交错字符串
给定三个字符串s1s2s3,请你帮忙验证s3是否是由s1和s2组成的。两个字符串s和t的定义与过程如下,其中每个字符串都会被分割成若干a + b意味着字符串a和b连接。原创 2024-02-19 00:09:30 · 895 阅读 · 1 评论 -
560. 和为 K 的子数组
给定数组 nums 和目标值 k,要找到子数组的数量,使其元素之和等于 k。为了解决这个问题,可以使用一个哈希表来存储之前出现的前缀和,并统计出现次数。遍历数组过程中,不断更新前缀和,并检查之前的前缀和中是否存在 sum[i] - k,如果存在,则说明找到了一个子数组的和为 k,累加相应的计数。检查当前位置之前是否存在前缀和为 sum - k 的情况,若存在,则累加相应的计数到 ret 中。初始化变量 sum 为 0,用于记录当前位置的前缀和。时间复杂度: O(n)空间复杂度: O(n)原创 2024-02-18 23:29:45 · 357 阅读 · 0 评论 -
面试题 17.19. 消失的两个数字
先将数组中的数和 [1, n + 2] 区间内的所有数「异或」在⼀起,问题就变成了:有两个数出现了「⼀次」,其余所有的数出现了「两次」。第一个 for 循环中,通过对数组中的所有元素进行异或操作,找出数组中所有元素的异或结果,因为相同的数异或结果为0,而缺失的两个数则会留下。第二个 for 循环中,从 1 到数组长度加 2(因为缺失了两个数),对这些数进行异或操作,得到的结果包含了缺失的两个数。然后通过异或结果中不同比特位的位置,将数组中的元素分成两类。对于每一类,分别异或操作,即可得到缺失的两个数。原创 2024-02-15 21:53:41 · 353 阅读 · 1 评论 -
44. 通配符匹配
这个问题是一个动态规划问题。我们惊奇的发现, dp[i][j] 的状态转移方程里面除了第一项以外,其余的都可以用 dp[i -1][j] 替代。因此,我们优化我们的状态转移方程为: dp[i][j] = dp[i - 1][j] || dp[i][j - 1]。当 p[j] == '*' 时,状态转移方程为: dp[i][j] = dp[i][j - 1] || dp[i - 1][j - 1] || dp[i - 2][j - 1]......空间复杂度: O(mn)O(mn)O(mn)原创 2024-02-17 10:59:47 · 373 阅读 · 1 评论 -
1312. 让字符串成为回文串的最少插入次数
我们可以定义一个二维数组 dp,其中 dp[i][j] 表示将子串 s[i...j] 转换为回文字符串所需的最小插入次数。然后,我们可以利用动态规划的思想来填充这个数组。= s[j],则需要进行插入操作。此时,我们可以取左边或上边的最小插入次数,并加上1,即 dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + 1。如果 s[i] == s[j],则不需要进行插入操作,因为 s[i] 和 s[j] 已经匹配,所以 dp[i][j] = dp[i + 1][j - 1]。原创 2024-02-11 21:59:53 · 428 阅读 · 1 评论 -
1745. 分割回文串 IV
动态规划: 我们首先使用动态规划来填充一个二维数组 dp,其中 dp[i][j] 表示字符串从索引 i 到 j 的子串是否为回文串。具体来说,如果字符串从 i 到 j 是一个单字符或者两个字符的回文串,则 dp[i][j] 为 true;如果字符串从 i 到 j 的首尾字符相同并且字符串 i+1 到 j-1 也是一个回文串,则 dp[i][j] 也为 true。具体地,我们遍历所有可能的分割位置 pos1 和 pos2,并检查是否存在合适的分割点,使得分割后的三个子串都是回文串。原创 2024-02-10 23:03:20 · 357 阅读 · 1 评论 -
LCP 30. 魔塔游戏
基本思路是模拟魔塔过程,遍历每个房间并记录当前的生命值,当生命值小于等于0时,需要选择一个最小的负值来补充生命值,直到遍历完所有房间或者生命值不足以继续前进。如果当前生命值小于等于0,则从小顶堆中弹出一个最小的负值,并用其补充生命值,同时记录补充次数。最终判断总生命值是否小于0,如果小于0则无法通过所有房间,返回-1,否则返回补充次数。创建一个小顶堆(优先队列),用于存储每个负值,即每次需要补充生命值的房间。更新当前生命值:将当前房间的值加到生命值上。空间复杂度:O(n)O(n)O(n)原创 2024-02-06 22:43:32 · 424 阅读 · 0 评论 -
516. 最长回文子序列
这段代码解决的问题是找到给定字符串 s 中最长回文子序列的长度。基本思路是通过填充一个二维的动态规划表 dp,其中 dp[i][j] 表示字符串 s 中从索引 i 到索引 j 的最长回文子序列的长度。在填表的过程中,通过状态转移方程处理不同情况,最终得到整个字符串的最长回文子序列的长度。返回结果: 最终的结果存储在 dp[0][n-1] 中,其中 n 是字符串的长度。填表的过程需要遍历二维表,其中每个元素的填充需要 O(1)时间。动态规划表的大小为 n×n ,占用 O(n^2)的空间。原创 2024-02-06 00:07:49 · 375 阅读 · 0 评论 -
1696. 跳跃游戏 VI
即,在位置 i 处的最大得分是在当前窗口内(i-k 到 i-1)找到的最大得分,加上当前位置的值。我们可以使用一个优先级队列(最大堆)来维护当前窗口内的最大得分,以优化查找最大得分的过程。题目要求在给定的数组中,从第一个位置出发,每一步可以向前跳跃最多 k 步,求能够获得的最大得分。这是一个典型的动态规划问题,需要找到状态转移方程来表示每个位置的最大得分。定义一个长度为 n 的数组 dp,其中 dp[i] 表示在到达位置 i 时的最大得分。空间复杂度: O(n)O(n)O(n)原创 2024-02-05 20:42:28 · 388 阅读 · 0 评论