- 博客(37)
- 收藏
- 关注
原创 【每日刷题】阶乘后的零
尾随零的个数,也就是求因子10的个数,可以转换为求因子2和因子5的个数。显然,质因子2的个数一定比质因子5的个数多,所以我们可以只求 n!官方题解,大意是统计5的倍数出现的次数。似懂非懂,不多说了,只放个代码。因此,遍历1到n,求每个数质因子5的个数,相加即为答案。
2025-07-12 17:26:31
294
原创 【每日刷题】Pow(x, n)
需要注意,int 的取值范围是 -2147483648~2147483647, 所以 n = -2147483648 时取反再赋值给 int 会溢出,只能用 long 来处理。但是模板不能直接套,这里的n可以为负数,所以要先把n变成-n,把x变成1/x。
2025-07-12 17:15:12
196
原创 【每日刷题】x 的平方根
当然这里也可以像官方题解一样,直接合并小于和等于,额外赋值ans=mid,无论开方是否为整数,最后都返回ans即可。为止,这时ans-1就是答案。需要注意可能会爆int,所以ans要开为long,最后再转换为int。如果开方为整数,会从return mid语句返回。因为非整数是向下取整,所以结果返回l-1。这道题很适合用二分来做,甚至题解就是标准的二分模板。
2025-07-12 00:08:21
306
原创 【每日刷题】加一
如果for循环结束还没有返回,说明给的数是9999这种一直走的if语句,那么就给数组扩容1个数并且重新初始化,把首位置为1,返回即可。后面看了别人的题解,反应过来如果flag为真,说明答案是100000这种,末尾肯定都是0。所以直接给newRes[0]赋值为1即可,其它位都是初始化的0,就可以直接返回了。先假设最后答案数组位数与原数组位数相同,如果flag为真,说明当前位需要+1,即。,说明需要进位,把res[i]置为0,flag置为true。否则res[i]不需要有变化,flag置为false。
2025-07-11 23:51:26
251
原创 【每日刷题】回文数
看八股看烦了,这个八股到底谁背得过,我到底为什么要来卷卷卷卷卷的Java后端啊!今天把面试150下数学专栏的题刷了,还剩一道hard,明天再刷。毕竟本来就是数学专栏,这个想得到就是想得到,想到了代码就出来了,想不到怎么都想不到。即可得到x的最高位,再与最低位比较,如果不相等就返回false。来源于官方题解,反转一半数字,然后判断是否为回文数。首先考虑如果x<0,带负号,肯定不是回文数,返回false。去除最低位,注意去除了两位数,所以cnt要减2。处理x,逐位比较最高位和最低位,判断是否相等。
2025-07-11 23:39:26
478
原创 【每日刷题】两数之和 II - 输入有序数组
分别从头和尾开始遍历,因为存在唯一解并且是有序数组,所以如果此刻low和high下标对应值之和大于target,说明high偏大,high--,反之low偏小,low++,直到找到答案返回结果。,那number[i]与j+1, j+2, ..., n-1下标对应的值相加都会大于target,所以后面的不用遍历了,直接跳出本层循环执行后i++判断下一个就可以了。每次都死性不改地用暴力试一下,暴力不过再开始暗戳戳写新方法【目移】直接暴力会TLE,优化了一下倒是过了,但是也要368ms,好孩子不要学。
2025-07-11 11:23:43
240
原创 【每日刷题】两数之和
创建一个哈希表,当遍历到x的时候,判断前面是否有target-x。而哈希表的时间复杂度是O(1),这样由双层循环优化到单层循环,时间复杂度从O(n^2)降到了O(n)。Java跑了50ms,Python更是跑了2636s【目移】也就是这道题不卡时间,不然肯定超时……
2025-07-11 10:48:36
270
原创 【每日刷题】岛屿数量
额外提一下:进DFS前判断边界,或者是在DFS函数最开始判断边界都可以(以前我甚至更习惯把边界判断直接拉个函数出来),这道题的时间是一样的。两个for循环确保每个点都被遍历,flag数组判断是否被遍历过,没遍历就用DFS搜一遍。注意边界条件和flag标记置为true就可以了,代码还挺好写的。Python不太熟,传参什么的写不对,直接找AI给我转换了一下。后面看了别人的题解,优化了一下,快了1ms,节省了一个flag数组。BFS是用队列存,然后把上下左右放进队列(如果符合条件),直到队列为空,就说明搜完了。
2025-07-10 12:57:33
419
原创 【每日刷题】验证回文串
题目要求是所以分两步,首先是处理得到只由小写字母和数字构成的短语,之后判断是否是回文串。简单题,只记一下代码。本篇题解分为“处理字符”和“判断回文串”两部分,各有两种方法。
2025-07-07 19:31:57
297
原创 【每日刷题】接雨水
方法一写下来只是记一个思路,方法二动态规划……万物皆可DP(确信),方法三是在方法二的基础上优化了空间,思路没太大变化,但是把空间复杂度由O(n)降到O(1)。官方题解下还有一个单调栈的方法,用单调栈计算能接的雨水总量。感觉有点难理解并且难想到,自己也是一知半解,就不写在这里了。感兴趣的可以自己去看看。
2025-07-04 18:00:55
466
原创 【每日刷题】H 指数
由于H指数不可能大于总的论文发表数,所以对于引用次数超过论文发表数的情况,我们可以将其按照总的论文发表数来计算即可,即citations里大于n的值都按照n计算。这样可以限制参与排序的数的大小为 [0,n](其中 n 为总的论文发表数),使得计数排序的时间复杂度降低到 O(n)。通过方法二可以得知,最终的时间复杂度与排序算法的时间复杂度有关,所以使用计数排序来进一步优化时间复杂度。判断是否满足H指数的函数不变,只是找h指数的过程由递增的循环改为二分查找。用的下面二分查找找x或x的前驱的模板。
2025-07-03 11:53:02
313
原创 【每日刷题】删除有序数组中的重复项 II
举一个例子,测试用例是[0,1,2,2,2,2,2,3,4,4,4],如果不保证数组是升序排列的,执行过程中会出现[0,1,2,2,3,4,4,3,4,4,4],此时l = 7,而nums[7] = 3,nums[6]是4,此时它们不相等,会执行else分支的操作,导致结果错误。首先是if判断条件,当nums[r]与nums[r-1]和nums[r-2]都相同时,说明是右指针是出现了第三次的重复元素,此时还要判断左指针那边是否是出现过两次,防止重复元素只出现了一次就直接下一个元素了。
2025-07-03 00:33:04
380
原创 【每日刷题】删除有序数组中的重复项
要求原地删除,并且每个元素只出现一次。因为是有序数组,所以代码很好写。用cnt来记录数组里不重复元素的个数,cnt初始化为1,当出现不同元素时,将该元素赋值给nums[cnt],然后cnt++。如果该元素是重复元素,会被直接跳过继续循环。
2025-07-02 23:58:20
115
原创 【每日刷题】移除元素
官方题解的思路写的还不错,不多赘述,思路如下:如果左指针 left 指向的元素等于 val,此时将右指针 right 指向的元素复制到左指针 left 的位置,然后右指针 right 左移一位。不必考虑赋值过来的元素是否等于 val,因为如果赋值为val,后续可以继续把右指针 right 指向的元素的值赋值过来,直到左指针指向的元素的值不等于 val 为止。题目说只要保证 nums 的前 k 个元素包含不等于 val 的元素即可,nums 的其余元素和 nums 的大小并不重要。
2025-07-01 23:41:06
431
原创 【每日刷题】反转链表 II
首先遍历一次得到pre(left对应位置的前一个节点)和succ(right对应位置的后一个节点),而start就是left位置对应的结点,end就是right位置对应的结点。方法一在极端情况下,left和right恰好是链表的头结点和尾结点,找到 left 和 right 需要遍历一次,反转它们之间的链表还需要遍历一次,时间复杂度仍为 O(N),但遍历了链表两次。对应到反转链表Ⅱ这道题里,就是在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。还有需要注意的一点,要切断链表。
2025-07-01 23:06:26
533
原创 【每日刷题】矩阵置零
本篇思路跟官方题解几乎完全一样,只是记录一下。方法一思路不难,也比较好写,但要改进到常数空间复杂度,就需要用到方法二。官方题解还有个方法三,个人感觉完全没必要,不予讨论。
2025-06-30 23:46:27
325
原创 【每日刷题】二进制求和
官方题解还有一个位运算,但是需要用高精度而且好像得用python吧。感兴趣的可以自己去看看。题解一就够AC的了,题解二是从底层优化了下时间,题解三是比较优雅的简洁代码。
2025-06-26 00:09:32
301
原创 【每日刷题】搜索二维矩阵
这个本质也是二分,只是需要处理一下行和列的问题。首先求得matrix的长度,即行数m,然后求得matrix[0]的长度,即列数n。这里的思想是把二维矩阵拉直成一条线,然后根据mid数得到行数i和列数j,同样直接套二分模板就可以了。这里额外特判了一下,如果小于矩阵最小值,或者大于矩阵最大值,直接返回false。
2025-06-24 14:16:25
264
原创 【每日刷题】搜索插入位置
除以2就是右移1位,位运算比除法运算快很多,所以进一步优化到最开始的。没什么要多说的,很经典的二分查找,经典到就是模板的程度。,考虑后者可能导致溢出,优化为。
2025-06-24 13:56:13
201
原创 【每日刷题】判断子序列
说实话,凭自己可能很难想到状态转移的写法,看了官方题解大概能理解,但是内化还是有一点难度。自认为理解的不够透彻,也就不在这里多说了,官方题解虽然有点啰嗦,但是仔细看会觉得还不错。但是动态规划版本的题解是为了应对题目描述里的“进阶”:如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。两个指针分别对应两个字符串,p1去遍历s,p2去遍历t。如果p1遍历完了说明s里的每一个字符都能按顺序匹配到t中的字符,即s是t的子序列。
2025-06-12 14:17:42
222
原创 【每日刷题】无重复字符的最长子串
当ed<n时进入循环,用一个容器来储存st到ed的字符,如果判断s[ed]已经存在,就说明出现了重复字符,此时移动st,直到移动到满足s[st-1]==s[ed]的位置,此时子串里就没有重复的字符了。是二刷了,比较快就自己写出来了。i是左指针,rk是右指针,第i到rk个字符是一个极长的无重复字符子串。在每一步的操作中,将左指针i向右移动一格,然后不断地向右移动右指针rk,中途需要保证这两个指针对应的子串中没有重复的字符。在移动结束后,这个子串就对应着以左指针开始的,不包含重复字符的最长子串。
2025-06-10 22:00:07
157
原创 【每日刷题】盛最多水的容器
说到这个,本科很想打ACM,断断续续参加过实训,但是因为学校理工科比较弱,知道很难拿名次(在校的几年我们这一级几乎都没过拿什么牌子),同时要兼顾保研,后面算是放弃算法了,只临时冲刺一个月参加了个蓝桥杯……有一个不太要求基础的又要加班钱还不多,面完后没等结果想了想直接拒了,没想到大厂难进(怕脏面评,也不想直接进人才库所以没投大厂)但小厂更是不招人……打算暑假沉淀,恶补一下八股基础,同时看看能不能包装一些项目经历,以及现在除了在Java后端卷生卷死,也在考虑python(如果决定用python,后面写刷题。
2025-06-09 23:52:54
307
原创 【每日刷题】赎金信
官方题解里还判断了一下字符串magazine和ransomNote 的长度,如果ransomNote更长直接返回false。没什么好多说的,看题出思路,接着出代码,把26个小写字母对应到大小为26的数组里即可。注释掉的是另一种遍历字符串的方法。最近比较忙,做点简单题。
2025-06-05 17:00:35
200
原创 【每日刷题】买卖股票的最佳时机 IV
最后还有一个很有意思的事情,自己设置k=2剩下的原封不动搬到Ⅲ也可以通过,然后如果设置k=n/2(买和卖最多n/2次,可以当天买卖但是利润为0所以毫无意义)剩下的原封不动搬到Ⅱ同样也可以通过。当然只是跑一下测试正确性,搬到Ⅱ能通过但是复杂度剧增,几乎由O(n)变成O(n^2),而且还要开辟新数组,试了一下时间到了1600ms左右。因为写了123,所以也整理一下4的思路吧。一步步看过来,到最下面的代码,就可以发现只是把buy2换成了buy[j],sell2换成了sell[j],别的几乎不变。
2025-06-05 16:26:55
392
原创 【每日刷题】买卖股票的最佳时机 III
最后ans初始化为0,与dp[n-1][1][0]和dp[n-1][2][0]比较一下,取最大值就是答案。此时仔细看可以看出,dp[i][][]只用到dp[i-1][][],dp[i-2][][]及之前的状态是完全不需要的,所以可以做空间优化:用buy1代替dp[i][0][1],sell1代替dp[i][1][0],buy2代替dp[i][1][1],sell2代替dp[i][2][0],四个变量直接优化掉整个三维dp数组,也就得到了最简洁的官方题解。最后dp[n-1][2][0]即为答案。
2025-06-04 22:20:48
311
原创 【每日刷题】买卖股票的最佳时机 II
上面的状态转移方程中,每一天的状态只与前一天的状态有关,而与更早的状态都无关,因此可以不必存储这些无关的状态,只需要将 dp[i−1][0] 和 dp[i−1][1] 存放在两个变量中即可:用dp0代替dp[i-1][0],用dp1代替dp[i-1][1],用newDp0代替dp[i][0],用newDp1代替dp[i][1],并且在循环结尾做一轮赋值。当时想的是dp[i][j]表示第i天持有第j天的买入价时的最大收益,而dp[i][0]表示第i天时没有持有股票的最大收益。分了三种情况,买入,不变,卖出。
2025-06-03 22:44:58
748
原创 【每日刷题】有效的数独
可以使用哈希表记录每一行、每一列和每一个小九宫格中,每个数字出现的次数。只需要遍历数独一次,在遍历的过程中更新哈希表中的计数,并判断是否满足有效的数独的条件即可。方法一:直接按规则遍历。先遍历行,再遍历列,最后遍历3*3方格。可以用index表示数字index+1出现的次数,其中。如果更新后的计数大于1,则该数独无效,返回false。对于数独的第 i 行第 j 列的单元格,其中。,该单元格所在的小九宫格的行数和列数分别为。,该单元格所在的行下标和列下标分别为。,对应的 index+1 满足。
2025-06-02 14:05:14
238
原创 【每日刷题】合并两个有序数组
运用的是双指针的思想,直接用i和j代表两个指针,选出最大的数,从后向前遍历,当i=0或者j=0时跳出循环。此时如果i>=0,即nums2已遍历结束全部移入nums1,那么nums1前面的数与结果相同,即原地移动,无需处理。排序序列长度为 m+n,套用快速排序的时间复杂度即可,平均情况为 O((m+n)log(m+n))。指针移动单调递减,最多移动 m+n 次,因此时间复杂度为 O(m+n)。时间复杂度:O((m+n)log(m+n))。空间复杂度:O(m+n)。时间复杂度:O(m+n)。
2025-05-31 09:20:57
279
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅