LeetCode
文章平均质量分 56
abyss_miracle
这个作者很懒,什么都没留下…
展开
-
【力扣】经典题,打印螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。如:1,2,34,5,67,8,9打印出:1,2,3,6,9,7,8,4,5这种题解可以说治好了多年的便秘:用四个变量up,down,left,right来控制遍历区域,进下一轮就一路走到底。每次进入下一条边之前,都要改变本条边遍历过的某个边界。一旦某两条边重合,就说明遍历结束了。class Solution {public: vector<int> spiralOrder(ve原创 2021-03-15 02:18:00 · 259 阅读 · 0 评论 -
【力扣分模块练习】并发/线程安全
1114. 按序打印我们提供了一个类:public class Foo {public void first() { print(“first”); }public void second() { print(“second”); }public void third() { print(“third”); }}三个不同的线程 A、B、C 将会共用一个 Foo 实例。一个将会调用 first() 方法一个将会调用 second() 方法还有一个将会调用 third() 方法请设计修改程原创 2021-03-06 17:21:48 · 314 阅读 · 0 评论 -
【力扣分模块练习】拓扑排序
210. 课程表 II现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。示例 1:输入: 2, [[1,0]]输出: [0,1]解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课原创 2021-03-06 15:49:20 · 217 阅读 · 0 评论 -
【力扣分模块练习】单调栈
503. 下一个更大元素 II给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。题解:用两个for暴力也能过,单原创 2021-03-06 13:55:42 · 145 阅读 · 0 评论 -
【力扣分模块练习】动态规划 + 排序(如何忽略一个维度的动归 / LIS算法)
如果碰到一种题目,有两个变量,解题时需要同时维护两个变量尽可能小的增加(增加幅度尽可能小),就需要用到这种动归+排序的方法。基准方法是用DP计算一个序列的最长递增子序列。300. 最长递增子序列给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4原创 2021-03-04 15:07:34 · 229 阅读 · 1 评论 -
【力扣分模块练习】动态规划 + 位运算
比特位计数给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]题解:对于所有的数字,只有两类:奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。举例:0 = 0 1 = 12 = 10 3 = 11偶数:二进制表示中,偶数中 1 的个数一定和除以 2 .原创 2021-03-04 00:12:37 · 108 阅读 · 1 评论 -
【力扣分模块练习】双指针 接雨水
11. 盛最多水的容器给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。解题思路:用原创 2021-03-01 11:55:58 · 125 阅读 · 0 评论 -
【力扣分模块练习】动态规划 打家劫舍专题
参考题解:代码随想录打家劫舍 II你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3原创 2021-02-24 23:08:59 · 118 阅读 · 0 评论 -
【力扣分模块练习】滑动窗口
1004. 最大连续1的个数 III给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。示例 1:输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2输出:6解释:[1,1,1,0,0,1,1,1,1,1,1]粗体数字从 0 翻转到 1,最长的子数组长度为 6。题解:基本上来说,M级别或以下的滑窗题只要翻译对了题目是比较容易的。总结了要点有以下两点:1.争取把题目翻译成“找出XXX样的原创 2021-02-19 01:57:59 · 408 阅读 · 0 评论 -
【力扣分模块练习】并查集及其变型
1202. 交换字符串中的元素给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。你可以 任意多次交换 在 pairs 中任意一对索引处的字符。返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。示例 1:输入:s = “dcab”, pairs = [[0,3],[1,2]]输出:“bacd”解释:交换 s[0] 和 s[3], s = “bcad”交换 s[1] 和 s[2],原创 2021-01-11 21:23:39 · 260 阅读 · 0 评论 -
【力扣分模块练习】动态规划 dp基础与背包专题
学习资料:代码随想录https://github.com/youngyangyang04/leetcode-master解题结构:1.确定dp数组以及下标的含义2.确定递推公式(状态转移方程)3.初始化dp数组4.确定遍历顺序和遍历边界5.举例推导dp数组 (如果不对就打印出dp数组,看看和手推的有哪些不同,然后再改进)基本动态规划 一维:509. 斐波那契数斐波那契数列的状态转移方程显而易见,dp[i]由dp[i-1]和dp[i-2]推出。从前向后遍历。class Solut原创 2021-01-05 22:17:49 · 238 阅读 · 0 评论 -
【力扣分模块练习】深度回溯
77.组合给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。样例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]坑点:跳出条件的if里面,不一定有回溯取消操作。之前PTA那些题很多是因为在最后一层的时候进行了一次正向操作,所以才需要跟一个取消操作。这题通过pos控制备选数组的起始脚标,这里要注意,下一轮递归中,Pos就是上一层i的加一,比如说一开始是[2],下一轮变成[2,3]才对,如果是原创 2020-12-15 17:20:24 · 258 阅读 · 0 评论 -
【力扣分模块练习】DFS与BFS
695. 岛屿的最大面积 深度优先,返回int题意:给定一个包含了一些 0 和 1 的非空二维数组 grid 。一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)如:输入:[[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1原创 2020-12-14 20:22:16 · 223 阅读 · 0 评论 -
【力扣分模块练习】二分查找
二分查找思路简单,但细节很搞人。个人习惯用左闭右开的区间写法,以下是模板:class Solution {public: int searchInsert(vector<int>& nums, int target) { int n = nums.size(); int left = 0; int right = n; // 我们定义target在左闭右开的区间里,[left, right) while (l原创 2020-12-08 01:33:32 · 418 阅读 · 0 评论 -
LeetCode 链表综合操作
147. 对链表进行插入排序转自:代码随想录需要注意:一开始虚拟头结点dummynode并没有指向head,用第一次循环的Pre->next指向cur来连接。如果一开始连接了,反而不对。struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} };class Solution {public: ListNode* insertionSortList(Li原创 2020-11-20 16:01:46 · 126 阅读 · 0 评论 -
双指针划窗小结
来自LEETCODE 76.大意:给一个S字符串和一串T,问你S的最短的哪一部分包括了T的所有字母元素。如:输入:s = “ADOBECODEBANC”, t = “ABC”输出:“BANC”用划窗:思路,先固定左边,向右扩展,扩展到满足条件为止(继续往右扩展木有意义了)。随后固定住右边,看看尝试往左移动的话,会不会继续满足条件,直到不满足条件为止。 不满足后,重复上述步骤,先固定左边,看看右边能否满足条件,以此类推。class Solution {public: string minWin原创 2020-11-19 04:27:33 · 136 阅读 · 0 评论 -
LeetCode 127.单词接龙 (BFS的妙用)
做LC的daily这题非常有意思。题目大意:给你一个开始word一个结尾word和一个wordlist,问你是否可以从开始变形到结尾(图的起点到终点),一次只能变一个字母,如果可以的话输出最小变形次数(最短路径)。如:string beginWord = "hit";string endWord = "cog";vector<string> wordList = { "hot", "dot", "dog", "lot", "log", "cog" };由于BFS是一层一层扫描的,所原创 2020-11-05 16:11:07 · 123 阅读 · 0 评论 -
LeetCode 双指针
目前碰到过的双指针,主要有以下几种用法:1.头尾指针,可以顶替一轮循环2.快慢指针,可以判断环路等18.四数之和给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。示例:给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。满足要求的四元组集合为:原创 2020-10-05 11:20:44 · 76 阅读 · 0 评论 -
LeetCode 动态规划
LCP 19. 秋叶收藏集小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片黄叶。出于美观整齐的考虑,小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等,但均需大于等于 1。每次调整操作,小扣可以将一片红叶替换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。Sample:输入:leaves原创 2020-10-01 17:46:40 · 86 阅读 · 0 评论 -
LeetCode 回溯法
LeetCode78.子集全排列大意:给一个数组如[1,2,3],求出全部的排列情况:{[],[1],[1,2],[1,2,3],[1,3],[2],[2,3][3]}有两种回溯思路来做:1.双递归:(转自力扣,笨猪爆破组)单看每个元素,都有两种选择:选入子集中,或不选入子集中。比如[1,2,3],先考察 1,选或不选,不管选没选 1,都再考察 2,选或不选,以此类推。画出递归树如下(解的空间树):一个子树是一个递归调用,考察当前枚举的数,选它,是一个分支,不选它,又是一原创 2020-09-21 13:50:50 · 334 阅读 · 0 评论 -
LeetCode小结 树的最优子结构(递归)
做了很多树的题目,发现非常多递归求最优子结构的(最大经过节点数、最长路径等)104. 二叉树的最大深度大意:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。class Solution {public: int maxDepth(TreeNode* root) { if(root == NULL) return 0; int L = maxDepth(r原创 2020-09-17 14:24:27 · 323 阅读 · 0 评论 -
LeetCode.50 快速幂算法 pow(x,n)
题目:实现 pow(x, n) ,即计算 x 的 n 次幂函数。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25解法:将n次幂拆分成若干次平方。以示例1的n = 10为例:0 -> 1-> 2-> 5-> 10;这样一来,利用递归的展开性,可以从逻辑链的右边往左边推。当n为奇数时,后一项的结果为y = y * y * x,当n为原创 2020-08-31 18:46:21 · 134 阅读 · 0 评论 -
LeetCode个人刷题笔记EZ篇
1.Eazymap中,map[一个不存在的key]返回整型Int0。程序容易出错在如果第一格是正确答案也是0.因此可以用map.find(key) == map.end()来做。3.Eazy整数最大范围:Integer.Max_VALUE27.Eazy用迭代器来删除erase数组中的某些元素:注意删除的那一次循环不要再it++了。因为在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元原创 2020-07-11 11:14:37 · 214 阅读 · 0 评论