飞道的博客

【大总结3】leetcode解题总览(算法、剑指offer、SQL、多线程、shell)

335人阅读  评论(0)

 3/22更新

剑指offer

题目链接

建议大部分题都会做,都能比较快速且准确的写出来。关于做题方式,我的建议是:一道一道刷即可,因为难度一般,不用系统的学习什么知识,遇到实在不会的就跳过即可。

我这里写了大概80%的题,剩下的题我个人感觉没什么意思或者很难说思路,就没有写了。

剑指offer:3-7:找出重复数字/二维递增数组查询/空格替换%20/返回顺序相反的链表数组/前序中序重建二叉树

剑指offer:8-11:栈模拟队列/斐波那契/上台阶/搜索旋转数组

剑指offer:12-17:矩阵是否包含字符串/(整数拆分)剪m段绳子最大乘积/快速幂/

剑指offer:18-21:删除链表节点/实现正则/判断是否是数字/奇偶排序

剑指offer:22-25:链表倒k节点/反转链表/合并链表

剑指offer:26-30:判断树子结构/二叉树镜像/二叉树是否对称/顺时针打印矩阵/min栈

剑指offer:31-32:判断栈序列/层序遍历/改版

剑指offer:33-37:判断二叉搜索树后序序列/打印二叉树sum路径/copy random/二叉树序列化反序列化

剑指offer:39-42:出现超一半的数/最小k个数/数据流中位数/最大子数组

剑指offer:45-48:贪心拼最小数/数字翻译为字母的方法数(dp)/向右向下的最优解(dp)/最长不重复子串(dp)

剑指offer:50-53:第一个出现一次/逆序对数量/找链表交点/在排序数组出现的次数(二分)/0-n-1范围未出现数字(二分,异或)

剑指offer:55-58:二叉树深度/判断平衡二叉树/和为s的两个数/翻转句子/部分反转句子

剑指offer:63-66:股票卖一次最大利润/不用*/、判断、循环实现1+2+n/不用+-*/求和/除自己之外的乘积

二分

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法,前提是数据结构必须先排好序,可以在数据规模的对数时间复杂度内完成查找。但是,二分查找要求线性表具有有随机访问的特点(例如数组),也要求线性表能够根据中间元素的特点推测它两侧元素的性质,以达到缩减问题规模的效果。

二分查找问题也是面试中经常考到的问题,虽然它的思想很简单,但写好二分查找算法并不是一件容易的事情。

leetcode 33 搜索旋转排序数组 到处是细节的好题

leetcode34. 在排序数组中查找元素的第一个和最后一个位置

leetcode35 插入的位置

leetcode74. 搜索二维矩阵 ,你见过吗leetcode240. 搜索二维矩阵 II

leetcode69 x的平方根

leetcode162. 寻找峰值 变种二分见过吗

leetcode 222. 完全二叉树的节点个数

leetcode270. 最接近的二叉搜索树值

leetcode367. 有效的完全平方数

leetcode374. 猜数字大小

leetcode704. 二分查找

位运算

位操作(Bit Manipulation)是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。

位操作包括:¬ 取反(NOT)、∩ 按位或(OR)、⊕ 按位异或(XOR)、∪ 按位与(AND)
移位:移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。
移位又分为算术移位、逻辑移位

leetcode52. N皇后 II 最强解法直接秒杀100%

leetcode67. 二进制求和

leetcode136 只出现一次的数字

leetcode 190. 颠倒二进制位

leetcode191. 位1的个数

leetcode 231. 2的幂

leetcode268. 缺失数字

leetcode338 比特位计数

leetcode371. 两整数之和 不用+号做加法

leetcode389. 找不同

leetcode461. 汉明距离

数组操作

数组是在程序设计中,为了处理方便,把具有相同类型的若干元素按有序的形式组织起来的一种形式。抽象地讲,数组即是有限个类型相同的元素的有序序列。若将此序列命名,那么这个名称即为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素。而用于区分数组的各个元素的数字编号则被称为下标,若为此定义一个变量,即为下标变量。

leetcode1 两数之和

leetcode41 缺失的第一个正数

leetcode48. 旋转图像

leetcode49. 字母异位词分组

leetcode 73. 矩阵置零

leetcode75. 颜色分类

leetcode88. 合并两个有序数组

leetcode128 最长连续序列

leetcode164. 最大间距 借桶思想秒掉hard题

leetcode189. 旋转数组

215. 数组中的第K个最大元素 BFPRT最牛解法

leetcode217. 存在重复元素

leetcode219. 存在重复元素 II

leetcode238 除本身以外数组的乘积

leetcode240. 搜索二维矩阵 II

leetcode283. 移动零 比官方更好的解法。

leetcode303 区域和检索

leetcode348. 判定井字棋胜负 好麻烦的代码

leetcode349. 两个数组的交集

leetcode350. 两个数组的交集 II

leetcode360. 有序转化数组

leetcode448. 找到所有数组中消失的数字 天秀记录法

链表

链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。

由于不必须按顺序存储,链表在插入的时候可以达到 O(1)的复杂度,比另一种线性表 —— 顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要 O(n) 的时间,而顺序表相应的时间复杂度分别是 O(log n) 和 O(1)。

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。

在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上一个/或下一个节点的位置的链接(links)。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的访问往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。

链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。

链表通常可以衍生出循环链表,静态链表,双链表等。对于链表使用,需要注意头结点的使用。

leetcode2 两数相加

leetcode19. 删除链表的倒数第N个节点

leetcode21 合并两个链表

leetcode23 合并K个排序链表

leetcode24 两两交换链表中的节点

leetcode25. K 个一组翻转链表

leetcode61 旋转链表

leetcode82. 删除排序链表中的重复元素 II

leetcode83 删除排序链表中的重复元素

leetcode86. 分隔链表

leetcode 92. 反转链表 II

leetcode141 环形链表

leetcode142 环形链表II

leetcode143 重排链表

leetcode147 对链表进行插入排序

leetcode160 相交链表

leetcode203 移除链表元素

leetcode206 反转链表

leetcode234 回文链表

leetcode237 删除链表中的节点(你意想不到的做法,注意细节)

leetcode328 奇偶链表

leetcode876 链表中间的结点

leetcode1290. 二进制链表转整数 刷新认知,最简单算法题

双指针

类型1:两指针中间夹的就是一个符合标准的答案,通过某种逻辑移动两个指针,扩大或缩小答案范围,最终找到最优解

类型2:快慢指针,可以应用在判断是否有环,或对空间要求高的合并等操作。

leetcode1 两数之和

leetcode3 无重复字符最长子串

leecode11 盛水最多的容器

leetcode15 三数之和

leetcode16 最接近的三数之和

leetcode18. 四数之和

leecode26 删除排序数组中的重复项

leetcode27 移除元素

leetcode42 接雨水

leetcode76 最小覆盖子串

leetcode80. 删除排序数组中的重复项 II

leetcode159. 至多包含两个不同字符的最长子串

leetcode167. 两数之和 II - 并没有那么easy的easy题

leetcode170. 两数之和 III - 数据结构设计

leetcode209. 长度最小的子数组 借这个题规范一下双指针写法

leetcode259. 较小的三数之和

leetcode340. 至多包含 K 个不同字符的最长子串

leetcode977. 有序数组的平方

贪心

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

leetcode31. 下一个排列

leetcode121买卖股票的最佳时机

leetcode122. 买卖股票的最佳时机 II

leetcode134. 加油站

leetcode169. 多数元素

leetcode179. 最大数

leetcode252. 会议室

leetcode253. 会议室 II

leetcode330. 按要求补齐数组 顶级难度玄学贪心

leetcode402. 移掉K位数字

leetcode435. 无重叠区间

leetcode 455. 分发饼干

动态规划

动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。

动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。动态规划往往用于优化递归问题,例如斐波那契数列,如果运用递归的方式来求解会重复计算很多相同的子问题,利用动态规划的思想可以减少计算量。

通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,具有天然剪枝的功能,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

leetcode10. 正则表达式匹配 一道没有解释的字符串dp困难题

leetcode32 最长有效括号

leetcode44. 通配符匹配 又是一道没有解释的字符串dp困难题

leetcode45 跳跃游戏II 秒杀所有答案

leecode53 最大子序列和

leetcode55 跳跃游戏 秒杀所有答案

leetcode56. 合并区间

leetcode57. 插入区间

leetcode63 不同路径II

leetcode64 最小路径和

leetcode70 爬楼梯

leetcode72 编辑距离

leetcode96. 不同的二叉搜索树 动归vs数学?​​​​​​​

leetcode97 交错字符串

leetcode115 不同的子序列

leetcode118. 杨辉三角

leetcode119. 杨辉三角 II 你能比我代码更短吗?

leetcode120. 三角形最小路径和

leetcode131. 分割回文串

leetcode132. 分割回文串 II

leetcode139 单词拆分

leetcode 152 乘积最大子序列

leetcode198 打家劫舍

leetcode213 打家劫舍II

leetcode221 最大正方形

leetcode256. 粉刷房子

leetcode276. 栅栏涂色

leetcode278. 第一个错误的版本

leetcode279 完全平方数

leetcode300 最长上升子序列

leetcode304. 二维区域和检索 - 矩阵不可变

leetcode322 零钱兑换

leetcode329. 矩阵中的最长递增路径

leetcode338 比特位计数

leetcode343. 整数拆分

leetcode376. 摆动序列

leetcode403 青蛙过河

leetcode414. 第三大的数

leetcode452. 用最少数量的箭引爆气球

leetcode516 最长回文子序列

leetcode542 01矩阵

leetcode718 最长重复子数组

leetcode887 鸡蛋掉落

二叉树

树是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由 n(n>0)n(n>0) 个有限节点组成一个具有层次关系的集合。

把它叫做「树」是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

它具有以下的特点:

每个节点都只有有限个子节点或无子节点;
没有父节点的节点称为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树;
树里面没有环路。

leetcode94 二叉树的中序遍历

leetcode95. 不同的二叉搜索树 II

leetcode96. 不同的二叉搜索树 动归vs数学?

leetcode98 验证二叉搜索树

leetcode101 对称二叉树

leetcode102 二叉树的层次遍历

leetcode103. 二叉树的锯齿形层次遍历

leetcode104 二叉树的最大深度

leetcode 106. 从中序与后序遍历序列构造二叉树

leetcode105 前序中序遍历序列构造二叉树

leetcode107. 二叉树的层次遍历 II

leetcode108 将有序数组转换为二叉搜索树

leetcode109. 有序链表转换二叉搜索树

leetcode110. 平衡二叉树

leetcode111. 二叉树的最小深度

leetcode112 路径总和

leetcode113. 路径总和 II

leetcode114. 二叉树展开为链表

leetcode117. 填充每个节点的下一个右侧节点指针 II

leetcode116. 填充每个节点的下一个右侧节点指针

leetcode124. 二叉树中的最大路径和

leetcode129. 求根到叶子节点数字之和

leetcode144 二叉树的前序遍历

leetcode145. 二叉树的后序遍历 意想不到的骚操作

leetcode 222. 完全二叉树的节点个数​​​​​​​

leetcode226 反转二叉树

leetcode235. 二叉搜索树的最近公共祖先

leetcode236 二叉树的最近公共祖先

leetcode257. 二叉树的所有路径

leetcode404. 左叶子之和

leetcode538 把二叉搜索树转换成累加树

leetcode543. 二叉树的直径

leetcode617. 合并二叉树

字符串处理

leecode5 最长回文子串

leetcode6. Z 字形变换

leetcode9 回文数

leetcode14. 最长公共前缀

leetcode28. 实现 strStr()

leetcode43. 字符串相乘 经典大数+和*

leetcode71. 简化路径 Unix 风格

leetcode125验证回文串

leetcode151. 翻转字符串里的单词

leetcode161. 相隔为 1 的编辑距离

leetcode165. 比较版本号 超级重要的细节

leetcode186. 翻转字符串里的单词 II

leetcode205. 同构字符串 一般人一次做不对的简单题

leetcode208. 实现 Trie (前缀树)

leetcode214. 最短回文串

leetcode242. 有效的字母异位词

leetcode243. 最短单词距离(vip题)好像挺简单?

leetcode266. 回文排列

leetcode344. 反转字符串 史上最简单力扣题

leetcode345. 反转字符串中的元音字母

leetcode383. 赎金信

leetcode387. 字符串中的第一个唯一字符

leetcode392. 判断子序列

leetcode409. 最长回文串

leetcode415. 字符串相加

leetcode434. 字符串中的单词数

leetcode647 回文子串

矩阵DFS

深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。

深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。

因发明「深度优先搜索算法」,约翰 · 霍普克洛夫特与罗伯特 · 塔扬在1986年共同获得计算机领域的最高奖:图灵奖。

leetcode79. 单词搜索 网格地图搜索+回溯经典写法啦

leetcode130. 被围绕的区域

leetcode200. 岛屿数量

leetcode212. 单词搜索 II

leetcode329. 矩阵中的最长递增路径​​​​​​​

在一维DFS

leetcode17. 电话号码的字母组合

leetcode22. 括号生成

leetcode39. 组合总和

leetcode40. 组合总和 II

leetcode46. 全排列

leetcode47. 全排列 II

leetcode77. 组合

leetcode78 子集

leetcode90. 子集 II

leetcode131. 分割回文串

leetcode339. 嵌套列表权重和

并查集

在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(Union-find Algorithm)定义了两个用于此数据结构的操作:

Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。
Union:将两个子集合并成同一个集合。
由于支持这两种操作,一个不相交集也常被称为联合-查找数据结构(Union-find Data Structure)或合并-查找集合(Merge-find Set)。
为了更加精确的定义这些方法,需要定义如何表示集合。一种常用的策略是为每个集合选定一个固定的元素,称为代表,以表示整个集合。接着,Find(x) 返回 x 所属集合的代表,而 Union 使用两个集合的代表作为参数。

leetcode261. 以图判树

leetcode323. 无向图中连通分量的数目

leetcode547. 朋友圈

队列/栈

栈(Stack)又名堆栈,它是一种重要的数据结构。从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作是线性表操作的子集,它是操作受限的线性表,因此,可称为限定性的数据结构。限定它仅在表尾进行插入或删除操作。表尾称为栈顶,相应地,表头称为栈底。栈的基本操作除了在栈顶进行插入和删除外,还有栈的初始化,判空以及取栈顶元素等。

队列(Queue)是一种先进先出(FIFO,First-In-First-Out)的线性表。

在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为 rear)进行插入操作,在前端(称为 front)进行删除操作。

队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。

队列常用的方法有:add、remove、element、offer、poll、peek、put、take。

leetcode20 有效的括号

leetcode84. 柱状图中最大的矩形

leetcode85. 最大矩形

leetcode155. 最小栈

leetocde 225. 用队列实现栈

leetcode 232. 用栈实现队列

leetcode239. 滑动窗口最大值

leetcode346. 数据流中的移动平均值

leetcode739 每日温度

数学

数学是利用符号语言研究数量、结构、变化以及空间等概念的一门学科,从某种角度看属于形式科学的一种。数学透过抽象化和逻辑推理的使用,由计数、计算、量度和对物体形状及运动的观察而产生。数学家们拓展这些概念,为了公式化新的猜想以及从选定的公理及定义中建立起严谨推导出的定理。

基础数学的知识与运用是个人与团体生活中不可或缺的一环。对数学基本概念的完善,早在古埃及、美索不达米亚及古印度内的古代数学文本便可观见,而在古希腊那里有更为严谨的处理。从那时开始,数学的发展便持续不断地小幅进展,至 16 世纪的文艺复兴时期,因为新的科学发现和数学革新两者的交互,致使数学的加速发展,直至今日。数学并成为许多国家及地区的教育范畴中的一部分。

今日,数学使用在不同的领域中,包括科学、工程、医学、经济学和金融学等。数学对这些领域的应用通常被称为应用数学,有时亦会激起新的数学发现,并导致全新学科的发展,例如物理学的实质性发展中建立的某些理论激发数学家对于某些问题的不同角度的思考。数学家也研究纯数学,就是数学本身的实质性内容,而不以任何实际应用为目标。虽然许多研究以纯数学开始,但其过程中也发现许多应用之处。

leetcode2 两数相加​​​​​​​

leetcode7 整数反转

leetcode13. 罗马数字转整数

leetcode38. 外观数列

leetcode43. 字符串相乘 经典大数+和*

leetcode50. Pow(x, n)

leetcode66. 加一

leetcode96. 不同的二叉搜索树 动归vs数学?​​​​​​​

leetcode171. Excel表列序号

leetcode172. 阶乘后的零 最快算法

leetcode202. 快乐数

leetcode204. 计数质数

leetcode263. 丑数

leetcode319 灯泡的开关

leetcode326. 3的幂 如此6的操作你想到了吗

博弈

leetcode292. Nim 游戏

leetcode1033. 移动石子直到连续

SQL

大部分是付费题目,可以看我的做题记录,目前做了一半(50题),另一半我觉得做出来对我个人的提升较小了,所以暂时没有做。

leetcode175. 组合两个表(SQL)

leetcode176. 第二高的薪水

leetcode 178. 分数排名(SQL)

leetcode180. 连续出现的数字(SQL)

leetcode181. 超过经理收入的员工(SQL)

leetcode182. 查找重复的电子邮箱(SQL)

leetcode183. 从不订购的客户(SQL)

leetcode184. 部门工资最高的员工(SQL) 连接+嵌套查询

leetcode197. 上升的温度(SQL)

leetcode511. 游戏玩法分析 I(SQL)

leetcode512. 游戏玩法分析 II(SQL)

leetcode534. 游戏玩法分析 III(SQL)

leetcode550. 游戏玩法分析 IV(SQL)

leetcode570. 至少有5名直接下属的经理(SQL)

leetcode574. 当选者(SQL)

leetcode580. 统计各专业学生人数(SQL)

leetcode584. 寻找用户推荐人(SQL)

leetcode585. 2016年的投资(SQL)

leetcode586. 订单最多的客户(SQL)

leetcode595. 大的国家(SQL)

leetcode596. 超过5名学生的课(SQL)

leetcode597. 好友申请 I :总体通过率(SQL)

leetcode601. 体育馆的人流量(SQL)

leetcode603. 连续空余座位

leetcode607. 销售员(SQL)

leetcode612. 平面上的最近距离(SQL)

leetcode613. 直线上的最近距离(SQL)

leetcode614. 二级关注者(SQL)

leetcode619. 只出现一次的最大数字(SQL)

leetcode620. 有趣的电影(SQL)

leetcode1045. 买下所有产品的客户(SQL)

leetcode1050. 合作过至少三次的演员和导演(SQL)

leetcode1068. 产品销售分析 I(SQL)

leetcode1069. 产品销售分析 II(SQL)

leetcode1070. 产品销售分析 III(SQL)

leetcode1075. 项目员工 I(SQL)

leetcode1083. 销售分析 II(SQL)

leetcode1084. 销售分析III(SQL)

多线程

这一部分要了解,知道自己使用的语言的并发工具,再懂一点点操作系统的多线程知识,就可以做了,但是数量不多。

(多线程)leetcode1114. 按序打印 认识AtomicInteger

(多线程)leetcode1115. 交替打印FooBar 记得Thread.yield();

(多线程)leetcode1116. 打印零与奇偶数

(多线程)leetcode1117. H2O 生成 认识Java中的PV原语

(多线程)leetcode1195. 交替打印字符串 最简单解法一个变量搞定

shell

用到的可以了解一下。

leetcode三道shell题


转载:https://blog.csdn.net/hebtu666/article/details/105030629
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场