- 博客(168)
- 问答 (1)
- 收藏
- 关注
原创 LeetCode:97.多数元素
这道题可以想象为一个抢占领地的游戏,我们将第一个数设置为胜利者,他首先抢占领地,将个数设置为1,如果下一个来的和他是同一个数字的话,count++,如果不同的话,count--,当count减为0的时候,说明他失败了,将下一个数设置为新的胜利者。
2025-10-06 15:44:02
413
原创 LeetCode:96.只出现一次的数字
这道题可以通过位运算来解决,我们知道相同的数异或结果会为0,所以我们只需要遍历数组进行异或运算,剩余的就是只出现一次的数字。
2025-10-06 15:38:00
182
原创 LeetCode:95.编辑距离
对于插入来说相当于在i+1位置插入一个字符,使i+1的字符等于j的字符,所以只需要让前i个字符转化为前j-1个字符的操作数加1即可,dp[i][j] = dp[i][j - 1] + 1。对于删除来说,相当于删除第i个字符,使前i-1个字符变为前j个字符,dp[i][j] = dp[i - 1][j] + 1。对于替换来说,将第i个字符替换使其与第j个字符相等,dp[i][j] = dp[i - 1][j - 1] + 1。
2025-10-06 15:32:49
762
原创 LeetCode:94.最长公共子序列
设dp[i][j]表示text1中前i个字符和text2中前j个字符最长公共子序列的长度,如果text1[i] == text2[j]的话,就去i - 1和j- 1的最长公共子序列长度加1,否则就看i - 1和j或者i和j - 1。
2025-10-06 11:46:26
336
原创 LeetCode:92.最小路径和
这道题与不同路径基本相同,只不过dp[i][j]取得是dp[i - 1][j]和dp[i][j - 1]中小的那一个值,再加上当前值。
2025-10-05 11:39:36
258
原创 LeetCode:91.不同路径
设dp[i][j]表示到达i,j位置的不同路径个数,到达i,j有两种方法,一种是从i - 1, j位置向下走一步,一种是从i,j - 1位置向右走一步,所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1],同时我们需要注意初始化问题,可以多开一行和一列,将[0][1]或[1][0]初始化为1。
2025-10-05 11:00:07
296
原创 LeetCode:89.分割等和子集
和sum为偶数后,我们可以将其看作一个背包问题,我们需要从数组中找到和为sum/2的数组,所以我们就将其转化为背包问题。对于这道题,我们可以先计算数组的总和,如果总和为奇数的话,就不需要后面的判断了,奇数和肯定无法分割等和子集。我们取这两种结果的或运算,只要满足一种即可。
2025-10-03 23:05:18
249
原创 LeetCode:88.乘积最大子数组
对于这道题,我们只通过一个状态转移方程是解决不了的,因为前面的乘积中可能会存在负数这种情况,我们应当用两个来解决。设f[i]表示以i位置结尾的子数组的最大乘积,g[i]表示以i位置结尾的子数组的最小乘积。g[i]的情况与f[i]一样。
2025-10-03 22:45:30
365
原创 LeetCode:86.单词拆分
设置dp[i]表示从[0,i]这个区间是否能在字典中找到,将[0,i]这个区间分为两个部分[0, j - 1]和[j, i],用一个哈希表来存储字典中的字符串,如果[0, j - 1]能够找到并且在哈希表中存在[j, i]的字符,那么表示可以拼接而成。
2025-10-03 10:03:17
239
原创 LeetCode:84.完全平方数
初始化的问题,我们需要用到上一个位置和左边的位置,所以需要从上到下,从左到右的初始化,同时注意边界问题,第0行第j列(1 <= j <= n)应当初始化为一个很大的值,表示不可能被选择,因为不会有从0个完全平方数中凑成j的情况。首先我们设dp[i][j]表示从前i个完全平方数中凑成j所需的最少数量,设置m为sqrt(n),因为对于一个n来说,所需要的完全平方数大小不会超过sqrt(n),比如16,开完为4,最多需要的完全平方数就到4,不可能到5。这道题通过动态规划来解决。
2025-10-02 17:51:32
862
原创 LeetCode:83.打家劫舍
我们要注意初始值,dp[0]没有房子偷,所以dp[0] = 0, dp[1] 只能偷第一间,dp[1] = nums[0]综上所述:dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
2025-09-29 00:18:50
416
原创 LeetCode:82.杨辉三角
状态转移方程为:dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j],其中 dp[i - 1][j - 1] 和 dp[i - 1][j] 是当前元素左上方和上方的元素值,例如 4=1+3, 6=3+3。dp:定义状态 dpi][j] 为杨辉三角中第 i 行第 j 列(行列索引从 0 开始)的元素值。
2025-09-28 23:21:49
262
原创 LeetCode:81.爬楼梯
对于这道题,我们发现到达楼顶可以分为两部分,在楼顶的前一个位置跳一步到达,在楼顶的前两个位置跳两步到达,所以我们可以设一个方程来表示。dp[n]表示到达第n阶楼梯的方法数量,通过上面可以得出dp[n] = dp[n - 1] + dp[n - 2]这样的通式。开这个dp数组的时候可以开n的大小,也可以开n + 1,在这里选择n + 1的大小,这样从dp[1]到dp[n]刚好对应。在dp中,我们需要初始化dp[1]和dp[2],因为dp需要用到前两个位置,遍历的时候从3开始。
2025-09-28 09:40:01
207
原创 LeetCode:80.划分字母区间
由于同一个字母只能出现在同一个片段,显然同一个字母的第一次出现的下标位置和最后一次出现的下标位置必须出现在同一个片段。因此需要遍历字符串,得到每个字母最后一次出现的下标位置。在得到每个字母最后一次出现的下标位置之后,可以使用贪心的方法将字符串划分为尽可能多的片段,具体做法如下。
2025-09-28 08:54:37
350
原创 LeetCode:79.跳跃游戏Ⅱ
这道题与上一道不同在于肯定可以跳跃过去,计算步数,我们用一个end来保存边界,如果说已经走到了end的话,想要再向前走就必须要再跳一次。每次在上次能跳到的范围(end)内选择一个能跳的最远的位置(也就是能跳到maxpos位置的点)作为下次的起跳点。
2025-09-28 08:54:15
373
原创 LeetCode:78.跳跃游戏
我们通过贪心算法来解决,用一个变量来保存能够跳到的最远位置,如果跳到的位置>=最后一个位置了,就可以成功,同时,在能够跳到的最远位置中不断更新从这里面的位置起跳可以跳跃到的最远位置。
2025-09-28 08:53:42
195
原创 LeetCode:76.数据流的中位数
由于满足以上条件,所以如果两个堆的数据个数相同返回他们的堆顶元素之和/2,不相同返回小根堆堆顶元素。那么插入的时候如何插入?
2025-09-27 19:27:22
295
原创 LeetCode:70.最小栈
最小栈可以通过一个辅助栈来解决,辅助栈只有当前插入值比栈顶元素小的时候才会插入,这样辅助栈的栈顶元素就是栈中的最小值。
2025-09-27 13:44:24
249
原创 LeetCode:69.有效的括号
这道题可以通过栈和哈希表来解决,通过哈希表建立左括号与右括号的映射关系,如果遇到左括号就将对应的右括号入栈,如果遇到右括号就将栈顶元素弹出与之匹配,相等说明匹配成功,否则返回false。
2025-09-27 13:28:43
229
原创 LeetCode:67.寻找旋转排序数组中的最小值
旋转排序数组符合上面的图,我们用x来表示数组的最后一个元素,如果大于x的话,说明在上半部分的有序区间,如果小于x的话,说明落在了下半部分的有序区间。通过用一个比较值来判断大小。
2025-09-27 09:50:59
398
原创 LeetCode:66.搜索旋转排序数组
旋转后的数组分为了左右两个有序的区间,我们首先需要判断mid落在左部分还是右部分,确定区间后的判断target在mid的左边还是右边。
2025-09-27 09:41:07
228
原创 LeetCode:65.在排序数组中查找元素的第一个和最后一个位置
这道题通过两次二分解决,首先二分左端点,将数组分为左侧<target,右侧>=target,当mid落在左侧时left = mid + 1,落在右侧 right = mid,二分右端点时,左侧<=target,右侧>target,mid落在左侧left = mid, 落在右侧right = mid - 1。
2025-09-27 09:29:03
225
原创 LeetCode:62.N皇后
我们发现每主对角线都符合y = x + b,所以可以写为y - x = b, 但是对于边界的几点例如(1,0)减出来为负数,所以可以统一加上皇后数n来保证正数,所以可以写为y - x + n = b + n,对于N皇后这道题,可以用标志数组来表示这列,主对角线,副对角线是否能存放皇后,那么如何用一个通式来描述。而副对角线符合y = -x + b, 写为y + x = b即可。
2025-09-26 22:16:01
377
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅