Leetcode刷题记录

2:两数相加。判断数组里和为n的两数位置。可用一层hash遍历解。
3:最长不重复子串。一层循环,用一个数组存储该字符上一次出现的位置。
4:找中位数:双针法。
5:最长回文子串。两层循环。
6:将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。模拟题。
7:整数反转,注意溢出的情况。int的范围是INT_MIN - INT_MAX
8:字符串转整型。注意溢出的情况。m = num * 10 + str[i] - ‘0’,这样写的时候会出现溢出,应该先减后加。
10:正则表达式匹配。分递归和动态规划两种方式。* 号可表示0及以上的之前出现过的字符。
11:求容纳最多水的容器。从两边向中间遍历,每次取小的那一边向里缩再进行比较即可。
12:整数转罗马数字。可考虑贪心法。
13:罗马数字转整数,水题。
14:最长共同前缀,水题。
15:求和为0的3个数,相当于求两数和为另一个数的相反数。第一个数字暴力解得,剩下两个数字用两个指针加二分法求得。
16:求最接近的3个数之和,双针法更新最接近的值。
17:电话号码的数字组合。DFS水题,注意vector < string >str中push进一个空的string和空的vector的区别。
18:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等,找出所有满足条件且不重复的四元组。双针法剪枝加二分法。
19:删除链表的倒数第N个节点。使用快慢指针,一次遍历即可。
20:括号匹配判断,使用栈。
21:两个有序链表合成一个。可考虑使用递归法。
22:生成有效括号对。dfs加剪枝,判断left是否为0。可考虑使用卡特兰数递归法。
23:合并k个有序列表,可转换成k-1次的两个有序列表合一。
24:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。链表题。可考虑递归解法。
25:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。k个数依次遍历指向前一个结点,下一层就递归。
26:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。注意题目中数组已经排序,且你不需要考虑数组中超出新长度后面的元素。双指针法。
27:给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。双指针法。
28:KMP算法。
29:两数相除,不能用乘除法。注意边界条件。不能同时分子分母左移求,会丢精度。题解很经典。
30:给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。滑动窗口法。
31:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。从后往前遍历,找到第一个下降的值nums[i],和之后刚刚大于这个值的nums[j]交换位置。再对i之后的进行排序。
32:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。动态规划,堆栈存位置,left和right计数器。注意数组的边界。
33:搜索旋转排序数组。分高区间和低区间进行二分查找。
34:求二分查找的范围,经典的二分查找题目。
35:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。二分查找。
36:判断数独是否为有效数独。一次迭代。
37:解数独。回溯法。
38:报数,水题。
39:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。dfs+剪枝,水题。
40:排列组合2。和39不同的地方在于candidates 中的每个数字在每个组合中只能使用一次,不能出现重复的答案。dfs+剪枝。
41:找数组中缺少的最小正数。桶排序或者是通过修改正负号判断。
42:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。可考虑堆栈,双针法。
43:字符串乘法。可使用两数每一位相乘分别相乘,然后在相应的位置累加,最后消掉最前面的0即可得到结果。
44:通配符匹配。给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 '* ’ 的通配符匹配。回溯剪枝或者是动态规划。
45:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。常规动态规划会超时,贪心或者是动规加剪枝。
46:找数组的全排列,dfs,一次ac。
47:找数组不重复的全排列,dfs。可考虑通过排序过滤相同值。
48:矩阵顺时针旋转90°,好的变量定义有助于减少bug
49:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。map+sort即可。
50、实现指数函数,快速幂方法。
53:求最大字序和,动态规划或者分治。
54:螺旋矩阵。注意边界条件。
59:螺旋矩阵2,矩阵为方阵,比较简单。
55:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。动态规划或者贪心。
56:给出一个区间的集合,请合并所有重叠的区间,排序。
60:给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,求第k个排列。利用数学性质求解。
61:旋转链表。将链表每个节点向右移动 k 个位置,其中 k 是非负数,注意边界条件。
62:二维vector的定义方法:vector dp(m, vector (n));求坐标原点到某一点的路径数目,排列组合或者动态规划。
63:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步,同时有障碍不能走,求不同的路径数目。动态规划,这题int会超范围。
64:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小,动态规划,类似62。
66:求数组代表的数字加一的值。
69:计算平方根。二分查找。注意如果需要left = medium,medium的计算可以用medium = (left + right + 1) / 2。
70:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?动态规划经典题目。
71:以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);题目难理解,栈的使用。
72:给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。动态规划,注意dp[i][j]表示的是word1[i - 1]和word2[j - 1]的情况。
73:给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。这题的坑点在于不能提前对边界刷0,否则会不知道是本身为0还是标志为0。
74:搜索二维有序矩阵,二分查找。
75:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。使用三指针一次遍历即可。
76:给一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。使用left, right双针法,可以先剔除S中不是T中的元素再进行查找。
77:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。dfs。
78:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。dfs,水题。
79:dfs加剪枝。
80:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。快慢指针。
81:按照升序排序的数组在预先未知的某个点上进行了旋转。编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。数组中可能有重复值。可通过线性遍历滤除重复值,再进行二分查找即可。
84:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。使用堆栈。
85:给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。可在84的基础上写,动态规划。
86:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。采用大小两个链表实现,最后进行链接。
88:给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。使用从后往前的方法可以省空间。
89:格雷编码。二进制转格雷码的方法。
91:一条包含字母 A-Z 的消息通过以下方式进行了编码,给定一个只包含数字的非空字符串,请计算解码方法的总数。动态规划,注意边界条件。
94:树的中序遍历,递归与非递归写法。题解中有一个颜色法很容易理解和变性。
96:给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?动态规划或者是卡特兰数。
97:判断一棵树是否为BST。注意不能只比较当前节点和左右子节点的大小。中序遍历,或者是设定子树值的区间范围。
101:判断一棵树是否为对称二叉树。dfs。
102:二叉树的层序遍历。
103:返回二叉树的z型遍历。用两个stack解。
104:求树的最大深度。dfs或者堆栈。
105:前序中序建树。同pat的思路,采用哈希表代替了循环找根节点,提高时间效率。
108:将有序数组转换为二叉搜索树。树的遍历。
114:将二叉树转换成链表。先将右子树挂在左子树最右节点下,然后左子树挂到原来右子树的位置。有递归和非递归解法。
116:填充每个节点的下一个右侧节点指针。树的遍历,需要常数空间。
118:杨辉三角。
121:购买股票,给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。一次遍历即可。
122:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票),贪心算法。
124:给定一个非空二叉树,返回其最大路径和。递归。
125:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
127:单词接龙:给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。图的遍历。
128:求最长连续时间序列。时间复杂度是O(n)。hash表加动态规划。注意条件中的if(cnt[nums[i]] = = 0)和if(cnt.count(nums[i]]) = = 0)的区别。因为有可能在操作前面的数组时就已经动过了cnt,导致count不为0了。
130:给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。dfs或者bfs。
131:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。dfs。
134:加油站。在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中。的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。贪心算法,1次遍历。
136:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素,异或。
138: 复制带随机指针的链表。指针题,空间复杂度最优为O(1)。条件ptr != NULL和!ptr的结果还不一样。然后类的构造函数参数省略会出问题。
139:单词拆分。可用回溯、动态规划。注意下标。
140:单词拆分2。回溯、动态规划。注意剪枝。
141:判断链表是否为环,快慢指针。题目中pos似乎没有意义。
142:判断链表形成环的第一个节点。其中的快慢指针很精髓。
146:LRU缓存机制。双向链表加hash的使用。定义:list > curList; unordered_map >::iterator> hash; list的成员函数包括erase、push_front、pop_back。
148:排序链表。归并排序,链表的断开和归并排序操作。
149:给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。用hash表存斜率的count值,斜率用化简之后的分式表示。
150:根据逆波兰表示法,求表达式的值。栈的使用。
152:乘积最大子序列。动态规划。
155:实现栈的功能,加上返回最小值功能。使用辅助栈,保证辅助栈栈顶是实际栈的最小值。
160:求两个链表的交点。同样可以使用双指针追及法。
162:寻找峰值,时间复杂度要求是log(n)。二分查找。
166:给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。长除法。用hash表存商,商相同时即为循环小数。string的push_back后接char, append后接string,都是在末尾加字符或字符串。可以用异或判断两数符号是否相同。
169:求众数。hash表,可考虑投票算法。
171:26进制转10进制。注意最后的运算先减后加防止溢出。
172:求n!中有多少个后缀0。求0-n中5的个数即可。
179:给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。字符串形式。在sort里面写cmp函数的方法:sort(arrays.begin(), arrays.end(), [](type a, type b) { return ; });
189:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。反转数组法。
190:颠倒二进制数。位运算。
191:求数字中1的个数。题解很强。
198:求数组中子数组乘积的最大值。子数组中不能取相邻的元素。动态规划,分正负两种形式。
200:求图的最大联通量数目。
202:编写一个算法来判断一个数是不是“快乐数”。水题。
204:统计所有小于非负整数 n 的质数的数量。
206:反转链表,可实现O(1)的空间复杂度。
207:拓扑排序,也可通过 DFS 判断图中是否有环判断。
208:前缀树操作。每个节点表示一个字母。
210:拓扑排序。
212:给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。前缀树的实现。
215:找出数组中第k大的数。可使用优先队列或者是快排。
217:给定一个整数数组,判断是否存在重复元素。哈希表。
218:城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。现在,假设您获得了城市风光照片上显示的所有建筑物的位置和高度,请编写一个程序以输出由这些建筑物形成的天际线。扫描线法。multiset的使用。
221:在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。动态规划。
226:翻转二叉树。遍历节点交换左右子树即可。
227:实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。数组模拟。230:找bst中第k小的数,中序遍历。
231:给定一个整数,编写一个函数来判断它是否是 2 的幂次方。考虑使用位运算。
234:判断链表是否为回文链表。翻转中部之前的链表,再与中部之后的进行比较即可,注意奇偶情况。
235:BST的LCA算法。bst直接循环搜索夹在两者之间的第一个根即可。
236:一般二叉树的LCA。
237:未知前置节点的情况下,删除链表中的节点。直接覆盖节点的内容即可。
238:除自身以外数组的乘积,不能用除法,O(n)和O(1)复杂度。乘积 = 当前数左边的乘积 * 当前数右边的乘积,双指针法。
239:你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。这题很有意思,只需判断是不是4的倍数即可。
242:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。哈希。283:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序,双指针法。
268:给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。可用异或或者正负或者求和。
287:寻找数组中出现超过一次的数,空间复杂度O(n),双指针法。
289:生命游戏。数组原地变换模拟题。
295:求数据流的中位数。大小堆或者是双指针。官方题解很经典。
297:二叉树的序列化与反序列化,stringstream的使用,stirng中的NULL实际用"#"表示
300:最长上升子序列。动态规划加二分查找,维护一个tail数组,表示递增的子序列,不断用更小的元素取代tail元素的最后一位。
301:删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。dfs。
309:股票问题,有冷冻期求最大利润。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。动态规划,有一个股票问题汇总题解值得再读。
312:要求你戳破所有的气球。每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币,求可得到的最大金币,动态规划。
315:计算右侧小于当前元素的个数。归并排序,树状数组。其中归并排序法与求逆序对题类似。inplace_merge(first, middle, last)可直接用于对两个有序的子数组进行归并排序,其中的三个参数是vector的迭代器。
322:给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。动态规划。
324:给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。快速选择 + 3-way-partition + 虚地址。nth_element(a+l, a+k, a+r)会使a这个数组中区间[l, r)内的第k小的元素处在第k个位置上(相对位置),但是它并不保证其他元素有序!
326:判断数字是否为3的幂。可考虑用int里面最大的3的幂对该数字取余。
328:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。双指针操作。前后指针要判断的是后指针的边界条件。
329:给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。拓扑排序、动态规划、记忆化dfs。
334:给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。维护first,second两个变量即可。
337:寻找二叉树中不能同时包含相邻节点的和的最大值,递归。
338:计算0到n中每个数字1的个数。位操作,题解很经典。
341:给定一个嵌套的整型列表。设计一个迭代器,使其能够遍历这个整型列表中的所有整数。列表中的项或者为一个整数,或者是另一个列表。两个栈分别存取当前层的当前位置以及末位。题解很经典。
344:字符串反转,水题。
347:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。堆排序和桶排序。类里边定义cmp的方法:
struct cmp
{
bool operator()(pair& a, pair& b){ return a.second > b.second; }
};

350:给定两个数组,编写一个函数来计算它们的交集。题目的意思应该是交集与顺序无关。hash表。
371:不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。位操作。注意这里为了兼容负数的移位,有符号数移位的时候移不动符号位,要换成unsigned int。
378:给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。二分法。
380:常数时间插入、删除和获取随机元素。hash或者set。set可使用advance函数进行迭代器的加法运算。
384:打乱一个没有重复元素的数组。Fisher-Yates 洗牌算法。
387:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。hash两次遍历。
394:给定一个经过编码的字符串,返回它解码后的字符串。编码格式为:k[encoded_string]。递归或者栈。
395:找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。回溯加剪枝。
399:给出方程式 A / B = k,根据已知方程式求解问题。图的问题,dfs、bfs、弗洛伊德、并查集。
406:假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。贪心,这题很有意思。
412:写一个程序,输出从 1 到 n 数字的字符串表示。判断是否为3或5的倍数。水题。
416:给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。0-1背包问题。
437:给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。本质上是两重递归。
438:找到字符串中所有字母异位词。题解很经典,滑动窗口解决字串问题。
448:找到所有在 [1, n] 范围之间没有出现在数组中的数字。利用正负号构建了一个简易的哈希表,用来存储每个数字的状态。
454:四数相加。给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。查找表,时间复杂度O(n2)。
461:两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。求汉明距离。异或之后求1的位数即可。
494:给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。0-1背包,转换很巧妙,注意0的情况,既可以加正号也可加负号。
538:给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。反中序遍历。
543:二叉树的直径,dfs。
557:带空格的字符串反转,水题。
560:给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。hash表。
581:最小无序子数组。求数组中无序子数组的长度。如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。可考虑用堆栈求无序的最大和最小值位置。
617:合并二叉树。遍历。
621:任务调度器,两个相同种类的任务之间必须有长度为 n 的冷却时间。贪心算法。
647:求回文子串的数目。动态规划或者中心扩展法。
739:根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。单调递增栈。

你可能感兴趣的:(Leetcode刷题记录)