leetcode刷题笔记
文章平均质量分 63
newCoderTheWarrior
学生
展开
-
关于LC的heap-use-after-free问题
今天在做LC934.最短的桥这题的时候遇到了heap-use-after-free问题。题目意思很简单,给一个01矩阵表示地图,地图里有且仅有两个由若干值为1的相连格子组成的岛屿,两个岛屿之间的距离大于等于1,让求两个岛屿之间的最短距离。于是我决定dfs标记第一个岛屿,并记录岛屿边缘格子,然后以边缘格子为开始一圈一圈向外进行多源bfs扩展,每扩展一圈两岛屿见距离加一,直至与另一个岛屿相遇。这是代码:class Solution { constexpr static int direction[4原创 2022-02-20 22:51:02 · 2310 阅读 · 2 评论 -
【Warrior刷题笔记】LC1376. 通知所有员工所需的时间【并查集表示的树的根节点到叶节点的最大路径和】详细注释简单易懂
题目LC1376.通知所有员工所需的时间解题思路本题实际上就是求以并查集表示的树的根节点到叶节点的最大路径和,当然这也是一个无环无向带劝图。首先,manager数组值manager[i]保存的是节点i的父节点,这不正是并查集的定义方式吗(对并查集不熟悉的小伙伴参考并查集求图的连通分量数以及并查集求图的连通分量数);其次,informTime值informTime[i]不正是节点i到其子节点的路径开销吗。于是,我们就可以将本题转化为求以并查集表示的树的根节点到叶节点的最大路径和。如果是普通的树形式,我原创 2022-02-19 21:42:35 · 435 阅读 · 0 评论 -
【Warrior刷题笔记】LC802. 找到最终的安全状态【图的DFS遍历】详细注释简单易懂
题目LC802.找到最终的安全状态解题思路本题为有向有环图的DFS。先来看题目要求:在有向图中,以某个节点为起始节点,从该点出发,每一步沿着图中的一条有向边行走。如果到达的节点是终点(即它没有连出的有向边),则停止。对于一个起始节点,如果从该节点出发,无论每一步选择沿哪条有向边行走,最后必然在有限步内到达终点,则将该起始节点称作是安全的。题目要求找出所有安全的起始节点,即图中的非环中节点。因此我们可以遍历所有节点,并以此节点为起始节点,DFS其所有后继节点,如果DFS过程中不含有环,即DFS过原创 2022-02-19 20:44:27 · 3317 阅读 · 0 评论 -
【Warrior刷题笔记】LC969. 煎饼排序 【冒泡排序的应用】详细注释双超一百
题目LC969.煎饼排序解题思路本题是冒牌排序思想的应用。冒牌排序的思想是每轮确定一个数的最终位置,不过冒牌排序是通过不断比较和换位实现这一目标的,而煎饼排序是通过翻转数组局部来实现这一目标的。算法的具体思想:1.将数组分为未排序+已排序两部分,初始时,已排序部分为空;2.每轮排序首先找出未排序部分的最大值的位置,判断这个位置属于以下哪种情况:如果该位置位于未排序部分的末尾,或者说已排序部分的开头,那么他已经处于最终位置,不做处理;如果该位置位于未排序部分的开头,那么直接将未排序部分翻转原创 2022-02-19 15:16:20 · 565 阅读 · 0 评论 -
【Warrior刷题笔记】LC1319. 连通网络的操作次数【DFS+并查集】详细注释简单易懂
题目LC1319.连通网络的操作次数解法一 深度优先遍历本题实际上就是求所有主机与主机间的边所构成的图的连通分量数。任意两个连通分量间只需要一根网线就能相连,最终所求答案就是连通分量数减一。不熟悉图和连通分量的,可以参考图与连通分量。这里我们首先使用dfs求图的连通分量数。我们使用visited数组标记遍历过的主机,防止重复遍历。从主机0开始进行遍历,若当前主机未遍历过,则连通分量数加一,同时以该主机为起点进行dfs标记该连通分量中的所有主机。遍历完成后返回连通分量数减一就是最终答案。代码cla原创 2022-02-18 21:04:03 · 277 阅读 · 0 评论 -
【Warrior刷题笔记】LC841. 钥匙和房间 【dfs】详细注释简单易懂
题目LC841.钥匙和房间解题思路本题可以使用深度优先遍历解决。我们使用visited数组值visited[i]标记每个房间i是否遍历过,防止重复遍历。然后从房间i=0开始,遍历拿到的钥匙rooms[i][j]所能去到的所有房间,并将遍历过的房间的已遍历标志位visited[i]置1,同时在第一次遍历某房间时将已遍历房间数count+1,在遍历完整个数组后判断count是否等于数组长m,若相等则返回真,否则返回假。代码class Solution {public: bool canVi原创 2022-02-18 20:32:24 · 235 阅读 · 0 评论 -
【Warrior刷题笔记】LC1020.飞地的数量 【DFS】详细注释简单易懂
题目LC1020.飞地的数量解题思路本题可以使用DFS解决。遍历每个格子,如果该格子是陆地,就DFS该陆地所在的岛屿,并计算岛屿面积,并修改格子值为2防止重复遍历。在遍历过程中,只要有一块陆地在边界,这个岛屿就不是飞地,否则就是飞地。计算所有飞地面积之和,返回答案ans。dfs遍历求所有岛屿面积参考LC200.岛屿数量class Solution {private: constexpr static int direction[4][2] = {{-1,0},{1,0},{0,-1},原创 2022-02-12 00:30:36 · 547 阅读 · 0 评论 -
【Warrior刷题笔记】1984. 学生分数的最小差值 【排序+滑动窗口】详细注释双超95
解题思路本题可以用排序+滑动窗口解决。题目要求返回任意选出的所有k个学生的最小分差,那么选出的这k个分数越接近分差就会越小。于是我们先对数组进行排序,这样连续的k个数都会比较接近,分差会尽可能小。然后从i=k-1开始依次增长滑动窗口右界和左界,实时更新当前最小分差为窗口右左界差值的最小值,遍历完毕后就能得到答案。代码class Solution {public: int minimumDifference(vector<int>& nums, int k) {原创 2022-02-11 00:21:25 · 808 阅读 · 0 评论 -
【Warrior刷题笔记】LC1405. 最长快乐字符串 【贪心+排序】详细注释双超一百
解题思路本题可使用贪心算法解决。s中最多有a个字母’a’、b个字母’b’、c个字母’c’,也即三个字符的剩余可使用数为a,b,c。我们使用贪心策略,每次都优先将剩余可使用数最多的字符插入快乐字符串末尾,同时更新该字符的剩余可使用数,直至连续使用一个字符两次,改用剩余可用次数次多的字符。原因是题目中规定出现三个连续字符的字符串不是快乐字符串。于是我们使用一个数组存储每个字符的信息,包括剩余可使用数,当前连续使用次数,以及字符本身。每次选字符都更新数组中的信息,并按剩余可使用数从小到大进行排序,这样方便每次原创 2022-02-07 14:21:31 · 443 阅读 · 0 评论 -
【Warrior刷题笔记】LC72. 编辑距离 【动态规划】详细注释简单易懂
解题思路本题可以使用动态规划解决。首先要理解编辑距离是指将word1转换成word2所使用的最少操作数。然后考虑这样一个问题,如果我们知道word1前i-1个字符所构成的字符串到word2前j-1个字符所构成的字符串的编辑距离是a(甭管怎么来的),那么当word1第i个字符与word2第j个字符相同时,word1前i个字符所构成的字符串到word2前j个字符串所构成的字符串的编辑距离也是a,因为新增字符都一样,无需做任何修改就能使word1前i个字符所构成的字符串到word2前j个字符串所构成的字符串相原创 2022-02-01 22:35:47 · 504 阅读 · 0 评论 -
【Warrior刷题笔记】1765.地图中的最高点 【多源广度优先遍历】详细注释简单易懂
题目LC1765.地图中的最高点解题思路本题可以使用多源广度优先遍历解决。题目要求得到高度值最大的高度安排方案,限制条件是相邻格子之间高度差最大为1,同时水域的高度限定为了0。因此我们可以从所有水域开始,与水域相邻的位置高度设置为1,与高度为1的位置相邻的格子高度设置为2,以此类推,将所有未遍历过的相邻格子高度都设置为当前格子的高度值加一,这样既可以满足限制条件,也可以使地图中的最高点高度最大化。我们使用多源广度优先遍历算法解决:计算数组长度m、宽度m,初始化bfs辅助队列q,初始化存答案数组a原创 2022-01-29 12:57:30 · 506 阅读 · 0 评论 -
【Warrior刷题笔记】1996. 游戏中弱角色的数量 【排序+倒序遍历】 详细注释,简单易懂
题目LC1996.游戏中弱角色的数量解题思路此题可以通过排序+倒序遍历处理。根据题意,一个角色是弱角色的充要条件是存在一个其他角色的攻击力和防御力都严格高于本角色。存在一个即可。那么我们不妨对数组按攻击力从小到大排序,之后对数组倒序遍历,并在遍历过程中实时更新最大防御力,则只要遍历到的当前角色防御力小于最大防御力,该角色就必然是弱角色。因为角色是攻击力从小到大排序的,而我们又是使用倒序的方式遍历,则已遍历过的角色攻击力一定比当前角色高,只需要有一个角色防御力严格高于当前角色,当前角色就是弱角色。这原创 2022-01-28 20:52:01 · 2488 阅读 · 0 评论 -
【Warrior刷题笔记】143.重排链表 【线性化 || 双指针+翻转链表+链表合并】详细注释
题目一 剑指 Offer 32 - I. 从上到下打印二叉树来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reorder-list/1.描述给定一个单链表L的头节点head,单链表 L 表示为:L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为:L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。2.示例示例 1:输入:原创 2022-01-12 21:23:19 · 288 阅读 · 0 评论 -
【Warrior刷题笔记】力扣306.累加数 【枚举+高精度加法】详细注释 双超100
题目来源:力扣地址:https://leetcode-cn.com/problems/additive-number/描述累加数是一个字符串,组成它的数字可以形成累加序列。一个有效的累加序列必须至少包含3个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。给你一个只包含数字'0'-'9'的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回true;否则,返回false。说明:累加序列里的数不会以0开头,所以不会出现1, 2, 03或者1, 02, 3的情况。原创 2022-01-10 15:21:15 · 370 阅读 · 0 评论 -
【Warrior刷题笔记】剑指offer 32. 三道题,让你学会二叉树的深度广度优先遍历与递归迭代技术
题目一 剑指 Offer 32 - I. 从上到下打印二叉树来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/1.描述从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。2.示例示例 1:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回:原创 2022-01-08 21:37:00 · 223 阅读 · 0 评论 -
【Warrior刷题笔记】剑指offer 6 24 35. 三道题,让你学会链表递归迭代辅助栈
题目一 从尾到头打印链表来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/1.描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。2.示例示例 1:输入:head = [1,3,2]输出:[2,3,1]解法一 迭代+辅助栈解题思路看到题不难想到最简单的办法就是借助一个辅助栈,顺序遍历将节点值入栈,然后再依次出栈,就能实现倒序打印。原创 2022-01-04 14:01:03 · 527 阅读 · 0 评论 -
【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨
题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/majority-element/注意,该题在LC中被标注为easy,所以我们更多应该关注的是文章中不断优化的思路和方法。很多时候面试考察的,就是与面试官一起做题并把时间复杂度和空间复杂度压榨到极致的过程中你所表现出来的能力。1.描述给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊n/2⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。2原创 2022-01-01 20:13:07 · 373 阅读 · 0 评论 -
【Warrior刷题笔记】力扣846. 一手顺子 【排序+哈希】详细注释
题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/hand-of-straights/1.描述Alice手中有一把牌,她想要重新排列这些牌,分成若干组,使每一组的牌数都是 groupSize ,并且由 groupSize 张连续的牌组成。给你一个整数数组 hand, 其中 hand[i] 是第 i 张牌的值,和一个整数 groupSize 。如果她可能按照题给条件重新排列这些牌,返回 true 。否则,返回 false 。2.示例示例原创 2021-12-30 16:30:15 · 131 阅读 · 0 评论 -
【Warrior刷题笔记】力扣5. 最长回文子串 【动态规划】详细注释
题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-substring/1.描述给你一个字符串 s,找到 s 中最长的回文子串。2.示例示例1输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例2输入:s = "cbbd"输出:"bb"示例 3:输入:s = "a"输出:"a"示例 4:输入:s = "ac"输出:"a"原创 2021-12-26 21:23:16 · 308 阅读 · 0 评论 -
【Warrior刷题笔记】力扣236. 二叉树的最近公共祖先 【树的深度优先搜索】详细注释
题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/1.描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。其中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”2.示例示例1输入:root = [3,5,1,6,2,0原创 2021-12-26 19:12:18 · 335 阅读 · 0 评论 -
【Warrior刷题笔记】牛客NC127 最长公共子串 【二分法+滑动窗口】详细注释
题目来源:牛客牛客算法 NC127 最长公共 子串1.描述给定两个字符串str1和str2,输出两个字符串的最长公共子串题目保证str1和str2的最长公共子串存在且唯一。2.示例示例1输入:"1AB2345CD", "12345EF"返回值:"2345"解题思路此题可以使用二分法加滑动窗口解决。计算串一str1和串二str2的长度m,n,使用low,high标记可能的公共子串长度上下限,初始化为0,n。初始化可能的公共子串长度len为(high-low)/2+low,原创 2021-12-25 20:57:43 · 524 阅读 · 0 评论 -
【Warrior刷题笔记】力扣1609. 奇偶树 【树的层序遍历】详细注释 双超90
题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/even-odd-tree1.描述如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标为 2 ,依此类推。偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减给你二叉树的根节点,如果二叉树为 奇偶树 ,则返回 true原创 2021-12-25 16:29:34 · 177 阅读 · 0 评论 -
【Warrior刷题笔记】力扣3. 无重复字符的最长子串 【记忆化滑动窗口+双指针+哈希】逐行注释
【Warrior刷题笔记】力扣题3. 无重复字符的最长子串 【记忆化滑动窗口+双指针+哈希】逐行注释原创 2021-12-24 11:45:24 · 175 阅读 · 0 评论