- 博客(79)
- 收藏
- 关注
原创 hot100-技巧
对 nums 数组建图,每个位置 i 连一条 i→nums[i] 的边,同时i连一条i→(i+1)的边。我们先设置慢指针 slow 和快指针 fast ,慢指针每次走一步,快指针每次走两步,根据「Floyd 判圈算法」两个指针在有环的情况下一定会相遇,此时我们再将 slow 放置起点 0,两个指针每次同时移动一步,相遇的点就是答案。首先从后向前查找第一个顺序对 (i,i+1),满足 a[i]<a[i+1]。双指针:维护p0和p1,p0代表0可以插入的下一个元素的位置,p1代表1可以插入的下一个元素的位置。
2026-02-27 21:36:17
626
原创 hot100-多维动态规划
时间复杂度:O(n^2)空间复杂度:O(n^2)时间复杂度:O(n^2)空间复杂度:O(n^2)时间复杂度:O(n^2)空间复杂度:O(n^2)时间复杂度:O(n^2)空间复杂度:O(n^2)时间复杂度:O(n^2)空间复杂度:O(n^2)
2026-02-26 14:30:16
88
原创 hot100-动态规划II
值,绝对是上一轮遗留下来的、还没加上当前物品的“干净”状态。【要满足0-1背包,需要从大到小,这样数组还没有被这一层的替换】每次循环,拿出一个数字(物品),考虑要不要把它放进背包。我们看当前这个物品,在不同容量的背包下,能发挥什么作用。,把它放进背包后,背包里的总和增加的值(价值)也是。还是上一轮的状态(还没被当前的数字 2 污染)。因为是从后往前更新的,当更新右边(大容量)的。重量和价值: 物品占用的背包容量(重量)是。值时,它需要用到的左边(小容量)的。也还是上一轮的老数据。就是背包的最大容量。
2026-02-24 20:42:00
351
原创 hot100-动态规划I
那么i=1就代表仅仅考虑体积1的物品,此时一更新,发现每个j容量背包都需要容纳j的物品;当i=2就代表开始考虑体积4的物品,此时我们仅仅从j=4开始【其他j装不下】,此时利用dp[0]发现捷径dp[4]=1,然后同时更新dp[5]=1+1=2。因为外层是容量在一点点变大,对于每一个容量,内层都会把所有可能的物品尝试一遍。它保证了物品是按一定顺序被放入背包的,比如完全平方数问题中先放尽所有的 1,再放 4。是外层循环(物品数量),内层是n-i**2,起决定作用的还是n(背包容量)的最少物品数就好了。
2026-02-22 11:34:29
83
原创 hot100-贪心
是解决股票问题的最佳思路【本题股票:仅允许买卖一次,无手续费】空间复杂度:O(∣Σ∣) # 其实这里的∣Σ∣最大是26。时间复杂度:O(n)空间复杂度:O(1)时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(1)时间复杂度:O(n)空间复杂度:O(1)时间复杂度:O(n)
2026-02-21 12:02:05
90
原创 hot100-堆
时间复杂度:O(n) # 不是很理解,但是这个在leetcode上时间会超时,必须按照官方的一个特殊的边界条件去写,利用=的判断,写do-while循环,才可以通过全是1的那个示例。空间复杂度:O(n) # 因为字典还是需要O(n),heapq需要O(k)时间复杂度:O(nlogn) # 本质就是堆排序。空间复杂度:O(logn) # 栈空间。空间复杂度:O(logn) # 栈空间。空间复杂度:O(n) # 两个堆的开销。时间复杂度:O(nlogn)空间复杂度:O(n)
2026-02-20 13:18:04
308
原创 hot100-栈
每当我们找到了一个比栈顶元素小的元素,那么对于栈顶元素,倒数第二个元素和未入栈的元素是比当前元素小的元素,那么要算以当前栈顶元素为高的最大面积就是中间的间隔*栈顶元素的高度。也就是说,对于每一个栈顶元素-1,-2的位置对应的温度会更高。当一个新的元素入栈前,如果比当前的栈顶元素来得高,那么栈顶元素对应的下一个最大元素就找到了。可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的数值递减。也就是说,对于每一个栈顶元素-1,-2的位置对应的柱子会更低。所有操作的时间复杂度:O(1)
2026-02-19 16:29:42
612
原创 hot100-二分查找
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)# 很巧妙的写法,可以只使用一个函数res = midelse:return res""""""# 我们只要想办法找到第一个等于target的下标1# 然后找到最后一个等于target的下标2# 所以其实是我们找到第一个大于等于的下标就是1# 我们找到的第一个大于的下标就是2时间复杂度:O(logn)空间复杂度:O(1)
2026-02-16 10:48:27
432
原创 hot100-回溯II
时间复杂度:O(n⋅2^n ) # n 是字符串 s 的长度。在最坏情况下,s 包含 n 个完全相同的字符,任意一种划分方法都满足要求,划分方案数为 2^(n−1)=O(2^n),每一种划分方法需要 O(n) 的时间求出对应的划分结果并放入答案,总时间复杂度为 O(n⋅2^n)。空间复杂度:O(MN) # O(MN) 的 visited 数组,栈的深度最大为 O(min(L,MN))。空间复杂度:O(n^2) # 回溯需要O(n) 的栈空间以及 O(n) 的用来存储当前分割方法的空间。
2026-02-14 14:16:43
113
原创 hot100-回溯I
时间复杂度:O(n*n!时间复杂度:O(n*2^n) # n个位置,每次选择或者不选择【这是一个比较宽松的上界】,经过剪枝没有这么高。时间复杂度:O(n×(2^n)) # 一共 2^n个状态,每种状态需要 O(n) 的时间来构造子集。空间复杂度:O(target) # 栈的递归深度,最差是target,即1+1+。时间复杂度:O(3^m+4^n) # m是3个字母的数字的个数,n是4个字母的数字的个数。空间复杂度:O(n) # path需要O(n),递归时栈的最大深度是n。
2026-02-13 11:57:29
335
原创 hot100-图论
在广度优先搜索的每一步中,取出队首的节点 u,将 u 的所有相邻节点的入度减少 1【移除下一个节点的入边】。初始时,所有入度为 0 的节点都被放入队列中,作为拓扑排序最前面的节点,并且它们之间的相对顺序无关紧要。空间复杂度:O(T⋅Σ),其中 T为所有已经插入字符串的长度之和,Σ 为字符集的大小,这里是26。时间复杂度:初始化为 O(1),其余操作为 O(n),n是每次插入或查询的word的长度。空间复杂度:O(min(M,N)) # 最坏情况:全是陆地,队列最大就是存一行或一列。
2026-02-12 13:22:03
779
原创 hot100-二叉树III
空间复杂度:O(H) # 树的高度,平均是log N 最差是N。时间复杂度:O(N^2)时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(1)空间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)
2026-02-10 12:57:27
73
原创 hot100-二叉树II
空间复杂度:O(log N) # 平衡二叉搜索树!时间复杂度:O(H+k) # H是树的高度,平均是log N。时间复杂度:O(H+k) # H是树的高度,平均是log N。空间复杂度:O(H) # H是树的高度,平均是log N。空间复杂度:O(H) # H是树的高度,平均是log N。如果使用迭代的思想实现中序遍历,可能更加直观。时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)
2026-02-09 11:03:13
342
原创 hot100-二叉树I
空间复杂度:O(H) 【H 平均是log N的高度,最差是N】空间复杂度:O(H) 【H 平均是log N的高度,最差是N】空间复杂度:O(H) 【H 平均是log N的高度,最差是N】补充:前序遍历 and 后序遍历。空间复杂度:O(n)时间复杂度:O(n)时间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(N)时间复杂度:O(N)
2026-02-07 16:08:38
95
原创 hot100-链表III
每个节点在每层合并中只被处理一次,有logK层,每层总工作量都是O(N)(因为每层都要处理所有N个节点)总时间复杂度 = N × logK = O(N log K)空间复杂度:O(log K) # 分治递归深度为log₂K,每次递归调用需要常数空间(存储左右指针和中间值)递归栈空间 = O(log K)时间复杂度:O(N log K) # 最小堆里面插入取出时间复杂度是O(log k) 对于每个元素都可能有以上处理。空间复杂度:O(n/k) # 因为实际上栈只有n/k层。空间复杂度:O(n)
2026-02-05 15:06:31
390
原创 hot100-链表II
时间复杂度:O(m+n)时间复杂度:O(m+n)空间复杂度:O(m+n)时间复杂度:O(m+n)空间复杂度:O(1)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(1)时间复杂度:O(n)空间复杂度:O(1)时间复杂度:O(n)空间复杂度:O(n)
2026-02-04 13:19:00
74
原创 hot100-链表I
其实递归和栈的本质差不多【栈思路好理解】空间复杂度:O(n) # 栈空间。空间复杂度:O(n) # 栈空间。空间复杂度:O(n) # 栈空间。时间复杂度:O(m+n)时间复杂度:O(m+n)空间复杂度:O(1)空间复杂度:O(n)空间复杂度:O(n)空间复杂度:O(m)空间复杂度:O(1)时间复杂度:O(n)空间复杂度:O(1)时间复杂度:O(n)时间复杂度:O(n)时间复杂度:O(n)时间复杂度:O(n)时间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(1)
2026-02-02 15:13:52
87
原创 hot100-矩阵
但是以上的做法没有用到列的单调信息。时间复杂度:O(mlogn)空间复杂度:O(m+n)时间复杂度:O(m+n)时间复杂度:O(mn)时间复杂度:O(mn)时间复杂度:O(nn)空间复杂度:O(1)空间复杂度:O(1)空间复杂度:O(1)空间复杂度:O(1)
2026-02-01 16:13:26
107
原创 hot100-普通数组
时间复杂度:O(NlogN) # 复杂度来自于排序!时间复杂度:O(N) # 数组叠加需要时间复杂度!时间复杂度:O(N) 每个元素最多被操作两遍。空间复杂度:O(N) # 两个数组。空间复杂度:O(N) # res。时间复杂度:O(N) 取元素。时间复杂度:O(N)空间复杂度:O(1)时间复杂度:O(N)空间复杂度:O(N)空间复杂度:O(1)空间复杂度:O(1)空间复杂度:O(N)时间复杂度:O(1)
2026-01-30 15:10:36
56
原创 hot100-子串
那么遍历数组的O(N)是不可少的,我们希望让获取max的操作变成O(1);假如我们仅仅是每遍历一个数组,仅仅记录最大值,但是我们就不知道这个最大值什么时候从当前窗口弹出!【查看栈顶或者弹出栈顶,都是对列表最后一个元素操作,时间复杂度差不多!题目看起来很简单,但是我们如果在每个子数组中都去统计最大值,那么时间复杂度就会很高O(kN),最终会超时!时间复杂度:O(N) 【每个元素除被遍历外,最多入对一次,出队一次 最多3N】空间复杂度:O(k) 【队列的最大长度就是k】空间复杂度:O(N)
2026-01-29 16:32:31
342
原创 hot100-滑动窗口
时间复杂度:O(m+(n−m)×Σ),其中 n 为字符串 s 的长度,m 为字符串 p 的长度,Σ 为所有可能的字符数。O(m) 来统计字符串 p 中每种字母的数量;需要 O(m) 来初始化滑动窗口;需要判断 n−m+1 个滑动窗口中每种字母的数量是否与字符串 p 中每种字母的数量相同,每次判断需要 O(Σ)。但是本质上最多slow和fast两个指针各自遍历一遍,所以还是O(N)空间复杂度:O(Σ)。用于存储字符串 p 和滑动窗口中每种字母的数量。空间复杂度:O(M) m是不重复字符的个数。
2026-01-28 15:23:31
283
原创 hot100-双指针
如果仅仅是找出有没有一组满足两数之和的数,但是并不要求输出组合时,使用集合解决两数之和,但是如果要求输出满足的组合时,集合不好用,会丢失组合!尽管使用了栈,但是每个元素最多被入栈和弹出一次,所以时间复杂度还是O(N),如果使用二分查找处理第二个元素和第三个元素,不会更快,因为理论上是。时间复杂度:O(N) 每个位置至多被遍历两遍。时间复杂度:O(N) 每个位置至多被遍历两遍。空间复杂度:O(1)空间复杂度:O(1)空间复杂度:O(1)空间复杂度:O(N)时间复杂度:O(N)空间复杂度:O(1)
2026-01-27 15:31:24
295
原创 hot100-哈希
由于我们每次只会让连续子序列的最小的那个数进入内循环,在内循环中会遍历这个连续子序列,所以最终时间复杂度还是O(N);空间复杂度也是O(N)【集合开销】时间复杂度:O(Nklogk) k是字符串的最大长度,klogk是排序的时间复杂度。从以下的列表就可以看到显式的时间复杂度O(N)空间复杂度:O(N) 【哈希表开销】空间复杂度:O(Nk)时间复杂度:O(N)
2026-01-26 11:19:36
304
原创 Day53-图论
无权图,没必要用dj等算法,仅仅使用深搜或者广搜;当然,广搜最合适,因为第一次出现目标点,就是最短路径的长度!不要被图论迷惑,不需要任何搜索技巧,仅仅是遍历,只要是岛屿边界【水或者是陆地】,+1即可。这个题用深搜和广搜都可以,但是根据题意很容易想到,用邻接表存储图肯定是最方便的。——仅仅一个字符不相同即可!
2026-01-20 23:08:45
436
原创 Day51-图论
逆向思考:我们找到第一边界和第二边界从低往高走的所有点,两个的交集就是我们要找的“高山”。可以构造一个visited,将周边全部记录为1,中间的孤岛的visited不查看,最后全部置为0。暴力思路:遍历每一个节点,对于每个节点使用深搜或者广搜,看看是否会达到边界(时间复杂度。但是也可以直接使用graph,将非孤岛置为2,最后还原!)由于不会重复访问同一个节点,所以实际复杂度更低。
2026-01-20 14:52:15
381
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅