算法
Ordiiii
无限进步
展开
-
LC-300-最长递增子序列
表示以i结尾的最长上升子序列。原创 2023-03-16 20:02:17 · 78 阅读 · 0 评论 -
LC-297-二叉树的序列化与反序列化
其无左递归也不存在二义性,故为LL(1)型文法,那么我用LL(1)型文法的手工解析,递归下降法进行解析。前序遍历二叉树,遇到空则将空表示为null,然后构造的时候再按照字符串进行前序构造。我们可以构造二叉树序列化为。原创 2023-03-15 21:18:25 · 83 阅读 · 0 评论 -
LC-287-寻找重复数
可以遍历数组,将数组中的值放到其对应位置(不断交换),如果发现不是自己位置上的值和当前值相等,意味着此时已经见到了重复的值,直接返回即可。然后才意识到不让修改数组,那么这种方法实际上不符合题意。原创 2023-03-14 22:15:52 · 69 阅读 · 0 评论 -
LC-283-移动零
类似二分排序的想法,将不等于0的都放到0的左边,等于0的都放到0的右边。将所有非0的元素往前移,那么剩下的元素全部赋值0.类似冒泡排序的想法,两两比较将0移到末尾。原创 2023-03-14 21:13:11 · 54 阅读 · 0 评论 -
LC-279-完全平方数
暴搜+剪枝,直接从n的开平方到1枚举,不断拆分n,知道n为0,此时记录最小值。当拆分的数已经大于记录的答案,既可以直接返回来剪枝。原创 2023-03-14 20:06:04 · 61 阅读 · 0 评论 -
LC-240-搜索二维矩阵 II
故如果target小于当前值,意味着它所在列的值都比target值大,故可以直接舍弃一列。因为每一行每一列都是升序的,故一种直观的方法就是遍历每一行,对每一行进行一个二分搜索。如果target大于当前值,意味着它所在行的值都比target小,故可以直接舍弃一行。因为行和列都是升序排列的,那么右上角为它所在行的最大值,为它所在列的最小值。我们取右上角的值为起始遍历的点进行比较,为什么取右上角的值?这样知道找到target或越界表示没找到。原创 2023-03-13 22:02:53 · 65 阅读 · 0 评论 -
LC-239-滑动窗口最大值
这道题是一道经典的单调队列的题,我们根据滑动窗口可以发现,滑动窗口中最大值左边的值我们是可以不用管的,因为它们总是比最大值先滑出窗口,但是右边的值确实要记录下来,因为最大值会先滑出,那么滑出后我们要看新的最大值,此时我们可以维护一个单调递减的队列,若新加入窗口的值比队尾小则加入,比队尾大意味左边窗口比它小的值且在队列中的值可以不需要了,因为它总是比这个大值先滑出窗口。这样每次滑动窗口的最大值就是这个单调递减队列的队首。原创 2023-03-13 21:31:42 · 68 阅读 · 0 评论 -
LC-236-二叉树的最近公共祖先
这个题算一个经典的题目了,我的方法是dfs遍历到结点,将路径记下来,那么这里就有两条路径,最近的公共祖先只要求这两个序列的最后一个相等的值。原创 2023-03-12 20:25:44 · 69 阅读 · 0 评论 -
LC-234-回文链表
我们可以利用快慢指针找到链表的中间位置,然后翻转后半部分链表,此时再判断前半部分和后半部分是否一一相等即可。当然也可以全部翻转链表查看时否相等。原创 2023-03-12 20:04:45 · 77 阅读 · 0 评论 -
LC-221-最大正方形
这题与之前做过的求二维最大矩形比较类似,但这题有限制条件就是只能为正方形,那么我们就可以利用二维前缀和来做,我们枚举起始点,那么第二个坐标我们只需枚举边长即可。原创 2023-03-11 20:57:23 · 53 阅读 · 0 评论 -
LC-215-数组中的第K个最大元素
【代码】LC-215-数组中的第K个最大元素。原创 2023-03-11 20:35:19 · 56 阅读 · 0 评论 -
LC-207-课程表
一般这种完成某一件事需要完成另一件事,就是典型的AOV网,那么如果能完成所有课程,这个图必须是有向无环图,那么我们可以利用拓扑排序的思路,求图的拓扑序,如果存在环,则无法遍历到所有的结点,可以用一个计数量来表示。原创 2023-03-10 15:34:57 · 61 阅读 · 0 评论 -
LC-206-反转链表
画图看指针如何操作即可。原创 2023-03-10 15:03:07 · 51 阅读 · 0 评论 -
LC-200-岛屿数量
这道题是经典的dfs或者bfs暴搜题,直接对岛屿进行暴搜标记已经访问,那么主函数就看有几个没被访问的岛屿。原创 2023-03-10 14:48:55 · 55 阅读 · 0 评论 -
LC-198-打家劫舍
这是一个DP问题,每间房屋存在两种状态,要么被偷,要么没被偷。那么由此我们其实就可以写出状态转移方程,此时状态方程为。表示前i间房间且最后一间房间为被偷的最大金额,同理。原创 2023-03-10 14:33:29 · 62 阅读 · 0 评论 -
LC-155-最小栈
核心的是解决如何维护当前栈中的最小值,我们其实可以利用一个栈(记为S),这个栈中的元素是单调递减的,如果压栈的值小于等于S的栈顶(既最小的元素),那么我们就该值也压入S,这样我们可以通过S的栈顶直接求当前栈的最小值,若弹栈的时候,若栈顶的值与S栈顶的值相等,那么我们需要弹出S的栈顶表示最小值已经弹出。原创 2023-03-10 12:58:45 · 67 阅读 · 0 评论 -
LC-152-乘积最大子数组
数组为{5,30,−3,4,−3},最大值为30,然后这并不对,最大值是整个序列相加,为什么?我们可以看最后一个数字,因为前面所有的数字相乘为一个负数,然而最后一个数字为负数,最后结果相乘为正数!故我们可以得出,如果前面为负值,那么当前数如果为负数,也可能使得答案最大,所以我们需要借助两个状态表示,一个表示以i结尾的最大子序列,一个表示以i结尾的最小子序列。,但这里有问题,如果有序列{5,6,−3,4,−3}, 求出来的。这里也许一开始会想到直接。原创 2023-03-02 20:56:33 · 50 阅读 · 0 评论 -
LC-148-排序链表
归并排序,因为是链表的形式,故归并的时候只需要按顺序链上即可,此时空间复杂度为常数。借助数组,讲链表结点存入数组中再进行排序后取出。原创 2023-03-02 20:02:30 · 61 阅读 · 0 评论 -
LC-146-LRU 缓存
用双向链表维护LRU中的key和value,若访问到则将对应的结点置换到链表尾部,若需要替换则直接替换链表头部,这个比较难debug,要注意细节。原创 2023-02-28 20:58:24 · 61 阅读 · 0 评论 -
LC-142-环形链表 II
利用快慢指针,慢指针一次走一步,块指针一次走两步,通过尝试可以发现,当快慢指针相遇时,其 离进入环的距离与头指针进入环的距离相等,故此时可以再次利用相遇使得指针指向环的入口。利用哈希表记录遍历到的结点,如果遇到遍历过的则返回该结点,否则返回NULL。原创 2023-02-28 19:24:13 · 51 阅读 · 0 评论 -
LC-141-环形链表
故我们可以利用一个超过其的值标记已经遍历过的,若遇到标记的则表示有环。因为我们可以发现链表中的值的范围是。原创 2023-02-27 20:46:07 · 44 阅读 · 0 评论 -
LC-139-单词拆分
一开始想着暴力解,直接遍历字符串,以某一个索引开头,若出现与字典中匹配的,就由以该位置的下一个位置进行重复的匹配,直到字符串全部匹配结束。表示以i结尾的字符串是否可以由字典中的单词构成。原创 2023-02-27 20:27:10 · 49 阅读 · 0 评论 -
LC-136-只出现一次的数字
直接用的unordered_map,没想到空间复杂度为常数的解法。异或运算,在异或运算中,两次相同的值抵消,剩下的就是出现一次的值。原创 2023-02-25 21:38:45 · 55 阅读 · 0 评论 -
LC-128-最长连续序列
这个思路比较容易想到,既对于每一个数,都尝试往后看,看数组中是否存在这个数(用unordered_set,哈希表实现),那么若一个数的前一个数在哈希表中,就可以跳过,因为若前一个数存在,意味着前一个数是在一个更长的区间内,此时这个数是区间中间的某一个值,此时可以跳过。本来想着用区间表示,如果出现一个值就看其相邻的是否有区间,做一个区间合并,但是没想出来。看题解发现是一种动态规划的思想。原创 2023-02-25 21:27:23 · 59 阅读 · 0 评论 -
LC-124-二叉树中的最大路径和
故可以发现,上述就是递归定义,可以直接用递归来做,为了防止重复计算,可以记录以某根为端点的最长路径,如重复直接返回即可。那么我们还需要求以某一个根我端点的最长路径,下列情况的最大值。经过某个根的最长路径,我们可以抽象为下列情况的最大值。原创 2023-02-23 21:01:47 · 66 阅读 · 0 评论 -
LC-105-从前序与中序遍历序列构造二叉树
由前序遍历可以知道根,由根可以知道左右子树的中序遍历,那么我们可以递归,分别摘出左子树前序遍历数组和中序遍历数组,摘出右子树前序遍历数组和中序遍历数组。我们可以利用前序遍历的下标与中序遍历中值相等的下标做一个映射关系,这样我们就可以省去递归中找根的。原创 2023-02-22 20:39:22 · 52 阅读 · 0 评论 -
LC-101-对称二叉树
递归比较左右两棵子树是否是二叉树,对于比较相同的树,我们递归的比较左右子树是否相等,而比较镜像的树是否相等,我们递归的比较一棵树的左子树与另一棵树的右子树,右子树与左子树。原创 2023-02-22 20:10:12 · 61 阅读 · 0 评论 -
LC-98-验证二叉搜索树
直接中序遍历存下值,可以发现如果是二叉搜索树,中序遍历的结果是升序的,故因此可以判断是否是二叉搜索树。原创 2023-02-22 19:52:26 · 54 阅读 · 0 评论 -
LC-96-不同的二叉搜索树
我们可以将一棵二叉搜索树抽象为一个顶点与左右两棵子树构成,这样统计一棵搜索树能构成多少棵不同的树转换为统计其左右子树能构成的不同二叉搜索树的乘积。,注意如果递归计算的话会TLE,原因是有一些值已经算过了,重复计算会使得计算量增大,故可以用记忆化搜索。实际上就是上述思想的非递归形式。原创 2023-02-22 18:45:31 · 48 阅读 · 0 评论 -
LC-85-最大矩形
这道题我们可以看成是 84-柱状图中最大的矩形的一个扩展,如果我们把每一行当作一个“地平线”,那么每一行都有1组成的柱体的序列,那么问题就转换为了对每一行来说,求以该行为“地平线”的柱状图中最大的矩形。直接暴力用了二维前缀和,果不其然超时了,没想到这是上一题的一个扩展。原创 2023-02-17 20:57:57 · 67 阅读 · 0 评论 -
LC-84-柱状图中最大的矩形
这道题典型的单调栈问题,因为我们可以发现,如果求以某一个柱子为高,看它能扩展到的左右两个最远的边界构成的矩形,那么其实就是找以该柱子为起点,左边比它小的第一个数的位置,右边比它小的第一个数的位置。对于找某个数左边比它小的第一个数,我们可以利用单调递增的栈来做。原创 2023-02-17 19:49:56 · 51 阅读 · 0 评论 -
LC-79-单词搜索
dfs直接搜素,注意可以剪枝,若dfs当前位置字符不对应相等则可以直接退出,直到满足字符相等且长度已经枚举到和word一样长时返回true。原创 2023-02-15 21:29:24 · 44 阅读 · 0 评论 -
LC-78-子集
求一个集合的幂集,那么可以直接用递归来枚举。个子集,枚举一个子集。原创 2023-02-15 20:45:02 · 54 阅读 · 0 评论 -
LC-75-颜色分类
因为颜色只有三种,用哈希表存下三种颜色的数量,然后依次从小到大重新插入到原数组中。原创 2023-02-12 20:48:52 · 71 阅读 · 0 评论 -
LC-72-编辑距离
表示word1前i个字符组成的单词转换到word2中前j个字符组成的单词最小的编辑距离。想到了动态规划,但是状态转移漏了一个条件。根据i, j指向的字符分为两种情况。:此时最短的编辑距离就是。,最后一个字符可以消去。原创 2023-02-12 20:32:38 · 98 阅读 · 0 评论 -
LC-70-爬楼梯
这实际上就是斐波那契数列,通过转移可以看到,我们只用了三个变量,故可以不用状态数组,而只用三个变量进行转移。故我们可以利用矩阵乘法快速幂求出。可相似对角化,从而表示为。为特征向量组成的矩阵。原创 2023-02-11 20:00:16 · 686 阅读 · 0 评论 -
LC-64-最小路径和
【代码】LC-64-最小路径和。原创 2023-02-11 19:21:59 · 68 阅读 · 0 评论 -
LC-62-不同路径
【代码】LC-62-不同路径。原创 2023-02-11 19:13:31 · 76 阅读 · 0 评论 -
LC-56-合并区间
遍历区间序列,若区间的起始位置大于维护的区间的终止位置,那么意味这从该区间则无法与前面的区间合成一个大区间,从而将维护的区间插入到答案序列中,同时更新维护的区间为当前遍历的区间。再维护一个区间,初始时为区间序列中第一个区间。先排序区间序列,按区间的起始位置排序。原创 2023-02-11 19:03:56 · 71 阅读 · 0 评论 -
LC-55-跳跃游戏
贪心的想法,通过对两个例子模拟可以发现,画出每一个位置可以跳过去最远的终点,可以发现,如果是到不了终点的序列,中间一定存在一个点,它前面的点都无法到达,如果将每一点的起点和能跳到的终点画一条线的画,就类似于中间断开了,断开了那么就意味着这个序列是无法到达终点的。依照该想法,可以遍历序列,记录当前能到达的最远的距离,如果出现了当前位置超过了能到达的前面几个点组成的能到达的最远距离,表示出现了裂痕,则不可达到。原创 2023-02-09 21:53:13 · 67 阅读 · 0 评论