Jack199274
码龄6年
关注
提问 私信
  • 博客:22,213
    22,213
    总访问量
  • 72
    原创
  • 1,582,204
    排名
  • 238
    粉丝
  • 0
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:北京市
  • 加入CSDN时间: 2018-10-20
博客简介:

Jack199274的博客

查看详细资料
个人成就
  • 获得313次点赞
  • 内容获得15次评论
  • 获得317次收藏
创作历程
  • 13篇
    2024年
  • 59篇
    2023年
成就勋章
TA的专栏
  • 数据结构和算法
    72篇
兴趣领域 设置
  • 人工智能
    自然语言处理
创作活动更多

超级创作者激励计划

万元现金补贴,高额收益分成,专属VIP内容创作者流量扶持,等你加入!

去参加
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

Grind75第13天 | 208.实现Trie、54.螺旋矩阵、721.账户合并

一个容易理解的例子是:给出若干个pair对(张三和张五,李四和李六),pair对表示这俩人是亲戚关系,那么可以构建亲戚图谱(合并操作)。再给出一个pair对(张三和李六),问他们俩是不是亲戚(查询是否有相同的根)。按照以下的遍历顺序去处理,注意到从左到右和其他的三个方向不一样,从左到右把一行的所有元素都遍历了,而其他方向的遍历则少一个元素。并查集的代码是作为模板直接用的,有三个部分:初始化,查找父节点(寻根),合并。时间复杂度:O(nlogn),其中 n是不同邮箱地址的数量,logn 是路径压缩的复杂度。
原创
发布博客 2024.01.18 ·
502 阅读 ·
8 点赞 ·
0 评论 ·
9 收藏

Grind75第12天 | 67.二进制求和、937.最接近原点的k个点、295.数据流的中位数

还需要注意的是,如果python实现,那么大根推是把数值取反,那么不仅插入时取反,在pop后加以使用时也要取反:(1)以上addNum的两种情况都需要把堆顶元素取反后再插入;对于当前位置的两个数字x和y,加和后的carry = carry + x + y,然后更新当前位置的数字为 carry % 2,下一步的carry = carry // 2。B保存较小的一半,顶点是其中最大的。因为从第k+1元素开始,判断是否小于顶点,如果小于,则弹出顶点,插入当前的元素,这样就保证一直维持k个最小的元素。
原创
发布博客 2024.01.17 ·
1006 阅读 ·
19 点赞 ·
0 评论 ·
20 收藏

Grind75第11天 | 310.最小高度树、127.单词接龙、230.二叉搜索树中第k小的元素

替换方案是:在遍历队列元素时,通过把单词的某个字符替换为26个字母中的一个,并且替换后的单词需要在word_list里面,这样的替换单词就是相邻节点。为了找到这些点,我们从边缘开始,先找到所有出度为1的节点,然后把所有出度为1的节点进队列,以它们为包围圈,不断地BFS,最后找到的就是两边同时向中间靠近的节点。从题目的例子可以看到,最小高度树的根节点,好像是入度比较大的节点,这是一个大概的认识。时间复杂度:O(n),其中 n 是为节点的个数。空间复杂度:O(n),其中 n是为节点的个数。
原创
发布博客 2024.01.16 ·
534 阅读 ·
7 点赞 ·
0 评论 ·
8 收藏

Grind75第10天 | 133.克隆图、994.腐烂的橘子、79.单词搜索

然后进行 BFS 遍历,对上、下、左、右四个方向的结点进行污染,同时加入队列,作为第1层的节点。这个题和【542.01矩阵】有点像,都是先把某个特定值的点加入到队列中,作为第0层,然后进行广度优先搜索,遍历第1层,第2层...DFS:从A开始克隆,遍历两个邻居B和D,遍历到B时,不管D了,继续遍历B的邻居A和C。其中A遍历过了,跳过。BFS:从A开始克隆,遍历两个邻居B和D,B和D都遍历完了,再遍历B的邻居A和C。BFS 结束后,新鲜橘子的数量仍未减为零,说明存在无法被污染的橘子,返回为-1,否则分钟数。
原创
发布博客 2024.01.15 ·
1065 阅读 ·
17 点赞 ·
0 评论 ·
17 收藏

Grind75第9天 | 733.图像渲染、542.01矩阵、1235.规划兼职工作

到弹出值为1的点时,它相邻的且未访问过的点(值也是1),距离都为2,即 dist[i][j] + 1。需要注意的是,如果算法开始之前,当前的颜色已经和需要染的颜色相同了,就直接返回,因为如果相邻点和当前颜色相同,那么就和需要染的颜色相同,不需要再染,如果相邻点和当前颜色不相同,那么没法染。使用队列,每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格的染色,并把上下左右4个方位加入队列。时间复杂度:O(nlogn),排序的复杂度是 O(nlogn),遍历+二分查找的复杂度合计是O(nlogn)
原创
发布博客 2024.01.14 ·
676 阅读 ·
6 点赞 ·
0 评论 ·
10 收藏

Grind75第8天 | 278.第一个错误的版本、33.搜索旋转排序数组、981.基于时间的键值存储

如果一个版本为错误版本(isBadVersion为True),那么第一个错误版本在该版本左侧(包括该版本);如果一个版本为正确版本,那么第一个错误版本在该版本的右侧(不包括该版本)。这个题,麻烦还是在于条件判断时,要不要加 == 符号,比如有时候是 = nums[left] 这个条件里加了等号,比如 [3,1],查找1,这个例子可以验证必须加等号。二分查找,统一写左闭右闭区间:while循环时,left
原创
发布博客 2024.01.13 ·
522 阅读 ·
8 点赞 ·
0 评论 ·
7 收藏

Grind75第7天 | 543.二叉树的直径、199.二叉树的右视图、297.二叉树的序列化和反序列化

543.二叉树的直径题目链接:https://leetcode.com/problems/diameter-of-binary-tree解法:做这个题,首先要搞清楚二叉树深度的定义。二叉树的深度在leetcode里,定义为从根节点到叶子结点的最长路径的节点数(注意不是边的数量)。所以如果只有一个根节点,那么深度为1。这个题,对于每个节点,都求出直径,再取所有节点直径的最大值。那么对于每个节点求直径,需要求出左子树的深度和右子树的深度,二者相加就是当前节点的直径。而树的深度为 max(左子
原创
发布博客 2024.01.12 ·
397 阅读 ·
7 点赞 ·
0 评论 ·
8 收藏

Grind75第6天 | 5.最长回文子串、76.最小覆盖子串、438.找到字符串中所有字母异位词

但是,这个并不一定是全局的最长回文子串。这个题和76.最小覆盖子串的思路差不多,都是用滑动窗口,都参考了labuladong的题解。对字符串进行遍历,在 i 这个位置,首先往左寻找与当期位置相同的字符,直到遇到不相等为止。遍历结束后,得到了最长回文子串的左坐标和长度,就可以得到最长回文子串了。时间复杂度:O(n+m),n和m分别为s和t的长度。空间复杂度:O(c),c为字符集的大小,即2*26。时间复杂度:O(n+m),n和m分别为s和t的长度。空间复杂度:O(c),c为字符集的大小,即26。
原创
发布博客 2024.01.11 ·
506 阅读 ·
5 点赞 ·
0 评论 ·
9 收藏

Grind75第5天 | 409.最长回文串、3.无重复字符的最长子串、8.字符串转换整数

容易错的地方是,python对负数求商和余数时,得到的结果非常反常识,比如 divmod(-128, 10) 得到的是 -13 和 2,这个结果与 -128 // 10, -128 % 10 得到的是一样的。我们发现,回文串如果是偶数长度,那么所有字符的个数为偶数个,回文串如果是奇数长度,那么除了中间的子串为一个奇数长度的单字符外,其他字符都是偶数个。空间复杂度:O(128),本题中没有明确说明字符集,因此可以默认为所有 ASCII 码在 [0,128) 内的字符。时间复杂度:O(n)空间复杂度:O(1)
原创
发布博客 2024.01.10 ·
490 阅读 ·
5 点赞 ·
0 评论 ·
6 收藏

Grind75第4天 | 141.环形链表、876.链表的中间节点、125.验证回文串

每次移动时,fast向后走两次,slow向后走一次,直到 fast 无法向后走两次(fast本身是null或者fast.next是null,就没法走了)。使用快慢指针,当一个链表有环时,快慢指针都会无限移动下去,并且快指针会追上慢指针,也就是说两个指针相等。还有空间复杂度为O(1)的写法,不需要事先去掉非字母数字的字符。节点数为偶数时,终止循环时,slow是中间两节点的后一个节点。节点数为奇数时,终止循环时,slow就是中间节点。空间复杂度:O(1),slow和fast是常数空间。空间复杂度:O(n)
原创
发布博客 2024.01.09 ·
493 阅读 ·
7 点赞 ·
0 评论 ·
10 收藏

Grind75第3天 | 155.最小栈、224.基本计算器、21.合并两个有序链表

pop() 方法: 判断将 pop() 出去的元素值是否是 min_stack 栈顶元素值(即最小值),如果是则将 min_stack 栈顶元素一起 pop(),这样可以保证 min_stack 栈顶元素始终是 stack 中的最小值。push() 方法: 每当push()新值进来时,如果小于等于 min_stack 栈顶值,则 push() 到 min_stack,即更新了栈顶最小值。最后如果两个链表长度不等,那么必有一个链表为空,一个不为空,那么把不为空的链表直接添加到dummy链表中。
原创
发布博客 2024.01.08 ·
564 阅读 ·
6 点赞 ·
0 评论 ·
9 收藏

Grind75第2天 | 238.除自身以外数组的乘积、75.颜色分类、11.盛最多水的容器

因此需要两个列表:L 和 R,对于nums中的索引i,L[i] 表示索引i左侧所有数字的乘积,R[i] 表示索引i右侧所以数字的乘积,那么L[i] * R[i] 就是除自身以外数组的乘积。基本的思路是,双指针为i和j,容器的盛水量由短板决定 min(h[i], h[j]) * (j - i)。双指针从两端往中间移动,移动的过程中,(j - i)一定是变小的,那么为了得到更大的容积,就需要短板变大,所以只能移动短板。Baseline:baseline的解法是统计0,1,2三个元素的个数,然后在原数组中修改。
原创
发布博客 2024.01.07 ·
585 阅读 ·
8 点赞 ·
0 评论 ·
8 收藏

TikTok真题第11天 | 1249.移除无效的括号、23.合并K个升序链表、773.滑动谜题

还有一种做法是直接在遍历字符的过程中,记录左括号,并且即时删除无效的右括号,最后遍历结束再删除左括号。如果栈不为空,那么该位置有效,且把前面左括号(栈顶元素)改为有效。(1)第一种方法是优先队列,即构造小根堆(队首元素最小),然后把所有链表添加到优先队列中,那么从队首到队尾是根据val进行升序排列的。这个题用栈来处理,用栈来记录左括号的位置,同时用一个向量来记录左括号和右括号是否有效(有效则不需要删除)。如果遇到左括号,那么栈中弹入,同时该位置为无效(需要删除),待后面遇到右括号再置为有效。
原创
发布博客 2024.01.01 ·
463 阅读 ·
10 点赞 ·
0 评论 ·
8 收藏

TikTok真题第10天 | 1541.平衡括号字符串的最少插入次数、1209.删除字符串中所有相邻重复项、1530.好叶子结点对的数量

由于栈中的元素是后进先出,那么最后拼接答案时,取出来的元素的顺序和原字符串的顺序是反的,比如abcd,在stack中是[a,b,c,d],那么stack.top() 取出来是[d, c, b, a],所以取出元素进行拼接后,需要翻转一下结果。如果当前为右括号,且左括号不为空,那么首先左括号数量减1(相当于栈中弹出左括号),表示消消乐,然后如果下一个还是右括号,就继续往下走 (idx+=2),如果下一个不是右括号,那么需要插入右括号 (result++)。空间复杂度:O(H),H为树的高度。
原创
发布博客 2023.12.31 ·
1584 阅读 ·
29 点赞 ·
0 评论 ·
27 收藏

TikTok真题第9天 | 163.缺失的区间、1861.旋转箱子、2217.找到指定长度的回文数

基本逻辑是,依次遍历nums中的所有的元素,判断这个元素(right)和上一个元素(left)的差值是否>=2,如果是,那么缺失区间为[left+1, right-1]。比如上一个为1,当前为3,那么缺失的区间为[2,2],如果上一个为1,当前为4,那么缺失的区间为[2,3]。如果当前是空的,那么最低位置不变,因为没有石头落下去占据最低位置,也没有障碍挡住石头下落。(1)如果回文数的长度为 intLength,那么第q位回文数的左半部分(回文数是奇数,那么包含中间的那个数)的计算公式如下。
原创
发布博客 2023.12.30 ·
877 阅读 ·
20 点赞 ·
0 评论 ·
21 收藏

TikTok真题第8天 | 418.屏幕可显示句子的数量、395.至少有K个重复字符的最长子串、1010.总持续时间可以被60整除的歌曲对

2)一行的开头刚好是一个word的中间,如果前一个为空格,则start不变,如果不为空格,则start需要减1。当前time的模为 time % 60,对应的数的模为:60 - time % 60,比如time=62,那么对应的数可以是58,118,模=60 - 62 % 60 = 58。这是 time 不为60的倍数的情况。和两数之和类似,区别在于两数之和中,存储的是 当前的num,寻找的是target-num,而这里存储的是当前time的模,寻找的是模和当前的模可以相加为target(60)的数。
原创
发布博客 2023.12.29 ·
1123 阅读 ·
20 点赞 ·
0 评论 ·
21 收藏

TikTok真题第7天 | 2422.使用合并操作将数组转换为回文序列、200.岛屿的个数、694.不同岛屿的个数

整块岛屿的形状就是每个小岛的形状的列表。而形状定义为相对于左上角第1个小岛的位置的偏移量,这样左上角第一个小岛的位置是(0, 0),下方的小岛则是(-1, 0)。这样,通过DFS或者BFS,可以得到这块岛屿上所有小岛的形状,从而得到整块岛屿的形状列表。总体思想是,从1个小岛开始,通过遍历所有垂直和水平方向的节点,把相邻的小岛连接起来变成一整块岛屿,同时标上特殊值用来记录该节点已经访问过了。BFD的O(min(M,N) ),在最坏的情况下(全部为陆地),队列的大小可以达到 min(M,N)。
原创
发布博客 2023.12.28 ·
1288 阅读 ·
31 点赞 ·
0 评论 ·
26 收藏

TikTok真题第6天 | 146.LRU缓存、333.最大的二分搜索树、621.任务调度器

如果当前node是二叉搜索树,就记录节点的个数,并返回节点个数,如果不是二叉搜索树,那就验证左右子树是否为二叉搜索树,分别记录节点的个数,然后取二者中的最大值进行返回。而删除最久未使用的node时,需要在哈希表和双向链表中都删除,那么可以由双向链表得到最久未使用的node,从而得到node的key,再从哈希表中删除,这是哈希表和双向链表之间的联系。如果当前节点不是 BST 的节点,那么更新 BST 的节点数 res 为左右子节点的各自的 BST 的节点数的较大值。空间复杂度:O(h),树的深度。
原创
发布博客 2023.12.27 ·
728 阅读 ·
7 点赞 ·
0 评论 ·
10 收藏

TikTok真题第5天 | 386. 字典序排数、785.判断二分图、886.可能的二分法

比如第二个条件,n=234时,如果number=199了,那么199 / 10 = 19, 19 / 10 = 1, 1+1=2,也是后面的字典序整数就是:2, 20, 200,..., 21,...。第一层从1开始,遍历到9,而后面层的循环,也就是递归,从0遍历到9。空间复杂度:O(n),存储节点颜色的数组需要 O(n) 的空间,并且在深度优先搜索的过程中,栈的深度最大为 n,需要 O(n)的空间。这个题是上一个题的加强版,也是用染色法或者并查集解决,所以在做此题之前,先把上一个题干掉了。
原创
发布博客 2023.12.26 ·
938 阅读 ·
23 点赞 ·
0 评论 ·
24 收藏

TikTok真题第4天 | 1366. 通过投票对团队排名、1029.两地调度、562.矩阵中最长的连续1线段

解法:这道题就是统计每个队伍在每个排名的投票数,队伍为A、B、C,则排名有1、2、3,按照投票数进行降序排列。如果有队伍在每个排名的投票数都一样,那么按照字母序进行排列。可以用哈希表也可以用数组处理(因为最多有26个队伍,即26个字母)。细节在于按照字母序排列,为了统一为按照数字降序排列,可以把队伍(字母)转为 (Z - 队伍),这样的话,如果队伍是A,那么数字为26,字母为Z,那么数字为0,字母序排列=数字降序排列。参考题解:1.2.边界条件:无。
原创
发布博客 2023.12.25 ·
1551 阅读 ·
28 点赞 ·
0 评论 ·
25 收藏
加载更多