- 博客(132)
- 收藏
- 关注
原创 295.数据流的中位数
不知道这题难在哪凭啥是hard,可以用list实现但是每次插入要排序复杂度为nlogn。可以通过两个堆来进行优化让时间复杂度降到logn。
2025-07-24 17:50:14
256
原创 84.柱状图中的最大矩形
通过遍历当前高度下左右比它小的边界寻找宽进而求当前高度最大面积,最后找所有高度的最大面积,在找边界过程中时间复杂度为n方,可以通过单调栈进行优化到n。入栈则入栈元素的左边界确定,出栈则将要出栈元素右边界确定,左右边界都确定时弹出栈。注意出栈元素是与未入栈元素进行的比较。
2025-07-24 16:43:27
193
原创 32.最长有效子括号
和我之前做过的有效的括号这道题非常像,本题通过下标差不断维护最大值,每遍历到‘)’且栈非空即进行一次取最大值。本题两个解法,dp和栈模拟,dp比较难理解,这里先给出栈的解法。
2025-07-24 15:37:27
128
原创 1143.最长公共子序列
当 text1[i - 1]!= text2[j - 1] 时,说明两个子字符串的最后一位不相等,那么此时的状态 dp[i][j] 应该是 dp[i - 1][j] 和 dp[i][j - 1] 的最大值。当 text1[i - 1] == text2[j - 1] 时,说明两个子字符串的最后一位相等,所以最长公共子序列又增加了 1,所以 dp[i][j] = dp[i - 1][j - 1] + 1;dp[i][j]=dp[i−1][j−1]+1, 当 text1[i−1]==text2[j−1];
2025-07-24 12:55:46
232
原创 4.寻找两个正序数组的中位数
难点在于如何分割两个相等的集合并找到中位数的条件,由于单纯遍历短数组时间为m无法达到log(m+n)的条件,所以利用正序数组性质再进行二分。注意判断边界条件如果在左右边界上给他初始化为负无穷或正无穷,最后判断奇偶看情况返回。
2025-07-23 23:09:03
140
原创 51.n皇后
不过如此,除了麻烦点之外思路很简单,判断行列对角线分别用三个集合即可,反而是存棋盘由于需要改变而String不可变(final修饰)要用StringBuffer/StringBuilder来实例化。dfs传七个参数,主函数初始棋盘。除去麻烦思路就是标准的dfs没有任何变式。
2025-07-23 21:46:07
280
原创 131.分割回文串
枚举分割的位置,对分割的每个子集判断是否为回文串,若是则存到temp中,再退回状态寻找其他分割位置。对回溯问题要脑子中时刻想着一颗树和一个指针,第几层,遍历到哪个元素,回滚后指针跑到哪了。
2025-07-23 20:26:31
353
原创 152.乘积最大子数组
最大乘积*nums[i]可能变成最小乘积,同理最小乘积也会变为最大乘积,要取a,b的最大或最小来维护preMax和preMin。相比最大和,最大乘积要维护一个最小乘积来处理负数的情况,思路和标准dp一样。
2025-07-23 13:51:53
188
原创 1280.学生们参加各科测试的次数
迷糊group by函数迷惑了半天,发现他是消除重复行的,在三个表连接过后会出现重复行,通过分组消除重复并统计。
2025-07-21 21:05:24
139
原创 1581.进店却从未进行交易的顾客
count用来计数,group by合并相同元素,同时学到了sql书写的标准格式。这个题描述很长但其实就是找一个表中出现但另一个表中未出现的字段并统计次数。
2025-07-21 18:49:17
139
原创 153.寻找旋转排序数组中的最小值
思路和上一个题一样甚至更简单,不用判断target的区间,一旦发现mid大于right的值,说明处于上游,left=mid+1,小于right则在下游,right = mid。
2025-07-20 15:35:28
155
原创 33.搜索旋转排序数组
如果 [l, mid - 1] 是有序数组,且 target 的大小满足 [nums[l],nums[mid]),则我们应该将搜索范围缩小至 [l, mid - 1],否则在 [mid + 1, r] 中寻找。如果 [mid, r] 是有序数组,且 target 的大小满足 (nums[mid+1],nums[r]],则我们应该将搜索范围缩小至 [mid + 1, r],否则在 [l, mid - 1] 中寻找。先说本题直观思路,O(n)复杂度直接遍历。
2025-07-20 14:41:34
261
原创 394. 字符串解码
数字存在数字栈中记录次数,字符存入当前字符串中,左括号将当前字符串和当前数字压入栈中,右括号将数字和字符弹出栈并拼接字符串。读字符串时遇到的四种情况:字符,数字,左括号,右括号。
2025-07-18 13:03:14
137
原创 31.下一个排列
从后往前找到第一个比当前遍历到的元素小的元素,再找遍历过的元素中第一个比他大的元素,交换二者,并将剩下的序列倒序重拍就得到了最接近原数的大于他的数字。还有个细节,调了快十几分钟了,当index为0时证明整个都要反转,提前判断i>=0再做查找否则数组越界。
2025-07-17 23:43:31
221
原创 34.在排序数组中查找元素的第一个和最后一个位置
用两次二分分别找最左和最右,和标准的二分略有区别,不能找到target就存入,而是不断更新左右边界。
2025-07-17 22:55:49
134
原创 74.搜索二维矩阵
这个想法也是基于之前做的一个s形矩阵?哦哦刚去回头看了一眼是搜索二维矩阵2,那没事了我说为啥我这么聪明,原来是之前的沉淀666。不是随手一写写出来了?这也不是标准二分而是一个小优化而已性能能击败全部人?标准二维二分太唐了,转化为一维性能更高可读性更强。
2025-07-17 21:14:37
235
原创 287.寻找重复数
如果数组中有重复的数,以数组 [1,3,4,2,2] 为例,我们将数组下标 n 和数 nums[n] 建立一个映射关系 f(n),快指针走两步 fast = fast.next.next ==> 本题 fast = nums[nums[fast]]通过建立下标和元素的映射关系,可以形成一个类似链表的结构,当元素重复时会出现环,通过快慢指针可以定位到环的入口。原本以为这个技巧题也是考察位运算,没想到是把数组当作链表看,通过快慢指针找链表中的环。
2025-07-17 20:51:54
298
原创 763.划分字母区间
本题就是不断取扩展cover能取到的最远距离,最后进行判断,没什么难的。这两天在搞项目,算法没有那么深入去学,写点简单轻松的贪心换换脑子。
2025-07-17 20:25:48
138
原创 155.最小栈
不懂这个题想考察什么,栈的结构?只有时刻能返回最小值这个需求需要维护一个minStack,其他就是基础栈的基础方法,可能将来项目中自己构造类的时候和这个类似吧。
2025-07-15 15:38:43
109
原创 75.颜色分类
最终也是这个题想考查的点是三路快排,思路类似快排,遇到0就放前面,遇到2就放后面。不扯淡了,小优化是计数排序,把每个元素个数记录,再开一个数组实现计数后的排序。不过这题出的也真没意思,要是100个数每个出现几次那该咋写?就用sort,就用sort,击败100%的人。
2025-07-15 14:05:35
128
原创 169.多数元素
同样存在通解和技巧解,通解自己秒了,还有由于多数元素指大于n/2的元素,所以排序后返回n/2处的元素也行,两行秒了。当前值和遍历的值相同则count++否则count--,减到零的时候换当前值。遍历一遍后返回当前值。本题主要考察摩尔投票法。
2025-07-15 13:10:57
176
原创 136.只出现一次的数字
通解:遍历map看哪个value为1,非常简单也不是本题考察的目的。作为技巧题,本题考察的就是利用异或的性质找只出现一次的元素。
2025-07-15 12:48:17
88
原创 300.最长递增子序列
i寻找新的元素,j遍历已经确定状态的元素,如果新元素大于之前的元素则加一。最后取当前遍历到的最大值(但感觉不用dp也能做,维护一个temp最大和全局最大就行了。不是连续递增子序列,和之前做的题稍微有些不一样;
2025-07-15 11:55:33
106
原创 139.单词拆分
遍历word过程中注意不要越界,同时substring传入的参数为startIndex和endIndex。若前缀匹配且当前word匹配则更新当前dp的值为true,并将其作为前缀传递给下一个word。
2025-07-15 11:27:35
209
原创 279.完全平方数
更进阶点的dp,但本质上和爬楼梯一样,只不过结果不一定来自于上n层,而是从0到n每一层均有可能为解,每一个和的最小取决于加数的最小,而加数的选择需要通过遍历j来实现。代码很短但状态转移的过程比较复杂(dp[i-j*j]有多种情况)
2025-07-15 01:30:02
187
原创 118.杨辉三角
有点动态规划的意思但不是真正的dp,他没有时刻维护最优解的思想,只是当下状态来自于过去状态的思想。还学到了二维可变list取某个坐标值的方法,get(row).get(col)
2025-07-15 00:50:30
202
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅