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: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),它是一种效率较高的查找方法,前提是数据结构必须先排好序,可以在数据规模的对数时间复杂度内完成查找。但是,二分查找要求线性表具有有随机访问的特点(例如数组),也要求线性表能够根据中间元素的特点推测它两侧元素的性质,以达到缩减问题规模的效果。
二分查找问题也是面试中经常考到的问题,虽然它的思想很简单,但写好二分查找算法并不是一件容易的事情。
leetcode34. 在排序数组中查找元素的第一个和最后一个位置
leetcode74. 搜索二维矩阵 ,你见过吗(leetcode240. 搜索二维矩阵 II)
位运算
位操作(Bit Manipulation)是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。
位操作包括:¬ 取反(NOT)、∩ 按位或(OR)、⊕ 按位异或(XOR)、∪ 按位与(AND)
移位:移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。
移位又分为算术移位、逻辑移位
leetcode52. N皇后 II 最强解法直接秒杀100%
数组操作
数组是在程序设计中,为了处理方便,把具有相同类型的若干元素按有序的形式组织起来的一种形式。抽象地讲,数组即是有限个类型相同的元素的有序序列。若将此序列命名,那么这个名称即为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素。而用于区分数组的各个元素的数字编号则被称为下标,若为此定义一个变量,即为下标变量。
leetcode448. 找到所有数组中消失的数字 天秀记录法
链表
链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
由于不必须按顺序存储,链表在插入的时候可以达到 O(1)的复杂度,比另一种线性表 —— 顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要 O(n) 的时间,而顺序表相应的时间复杂度分别是 O(log n) 和 O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上一个/或下一个节点的位置的链接(links)。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的访问往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。
链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。
链表通常可以衍生出循环链表,静态链表,双链表等。对于链表使用,需要注意头结点的使用。
leetcode237 删除链表中的节点(你意想不到的做法,注意细节)
leetcode1290. 二进制链表转整数 刷新认知,最简单算法题
双指针
类型1:两指针中间夹的就是一个符合标准的答案,通过某种逻辑移动两个指针,扩大或缩小答案范围,最终找到最优解
类型2:快慢指针,可以应用在判断是否有环,或对空间要求高的合并等操作。
leetcode167. 两数之和 II - 并没有那么easy的easy题
leetcode170. 两数之和 III - 数据结构设计
leetcode209. 长度最小的子数组 借这个题规范一下双指针写法
leetcode340. 至多包含 K 个不同字符的最长子串
贪心
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
动态规划
动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。动态规划往往用于优化递归问题,例如斐波那契数列,如果运用递归的方式来求解会重复计算很多相同的子问题,利用动态规划的思想可以减少计算量。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,具有天然剪枝的功能,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
leetcode10. 正则表达式匹配 一道没有解释的字符串dp困难题
leetcode44. 通配符匹配 又是一道没有解释的字符串dp困难题
leetcode96. 不同的二叉搜索树 动归vs数学?
leetcode119. 杨辉三角 II 你能比我代码更短吗?
二叉树
树是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由 n(n>0)n(n>0) 个有限节点组成一个具有层次关系的集合。
把它叫做「树」是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
它具有以下的特点:
每个节点都只有有限个子节点或无子节点;
没有父节点的节点称为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树;
树里面没有环路。
leetcode117. 填充每个节点的下一个右侧节点指针 II
leetcode145. 二叉树的后序遍历 意想不到的骚操作
leetcode 222. 完全二叉树的节点个数
字符串处理
leetcode205. 同构字符串 一般人一次做不对的简单题
leetcode243. 最短单词距离(vip题)好像挺简单?
矩阵DFS
深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。
深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。
因发明「深度优先搜索算法」,约翰 · 霍普克洛夫特与罗伯特 · 塔扬在1986年共同获得计算机领域的最高奖:图灵奖。
leetcode79. 单词搜索 网格地图搜索+回溯经典写法啦
leetcode329. 矩阵中的最长递增路径
在一维DFS
并查集
在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(Union-find Algorithm)定义了两个用于此数据结构的操作:
Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。
Union:将两个子集合并成同一个集合。
由于支持这两种操作,一个不相交集也常被称为联合-查找数据结构(Union-find Data Structure)或合并-查找集合(Merge-find Set)。
为了更加精确的定义这些方法,需要定义如何表示集合。一种常用的策略是为每个集合选定一个固定的元素,称为代表,以表示整个集合。接着,Find(x) 返回 x 所属集合的代表,而 Union 使用两个集合的代表作为参数。
队列/栈
栈(Stack)又名堆栈,它是一种重要的数据结构。从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作是线性表操作的子集,它是操作受限的线性表,因此,可称为限定性的数据结构。限定它仅在表尾进行插入或删除操作。表尾称为栈顶,相应地,表头称为栈底。栈的基本操作除了在栈顶进行插入和删除外,还有栈的初始化,判空以及取栈顶元素等。
队列(Queue)是一种先进先出(FIFO,First-In-First-Out)的线性表。
在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为 rear)进行插入操作,在前端(称为 front)进行删除操作。
队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。
队列常用的方法有:add、remove、element、offer、poll、peek、put、take。
数学
数学是利用符号语言研究数量、结构、变化以及空间等概念的一门学科,从某种角度看属于形式科学的一种。数学透过抽象化和逻辑推理的使用,由计数、计算、量度和对物体形状及运动的观察而产生。数学家们拓展这些概念,为了公式化新的猜想以及从选定的公理及定义中建立起严谨推导出的定理。
基础数学的知识与运用是个人与团体生活中不可或缺的一环。对数学基本概念的完善,早在古埃及、美索不达米亚及古印度内的古代数学文本便可观见,而在古希腊那里有更为严谨的处理。从那时开始,数学的发展便持续不断地小幅进展,至 16 世纪的文艺复兴时期,因为新的科学发现和数学革新两者的交互,致使数学的加速发展,直至今日。数学并成为许多国家及地区的教育范畴中的一部分。
今日,数学使用在不同的领域中,包括科学、工程、医学、经济学和金融学等。数学对这些领域的应用通常被称为应用数学,有时亦会激起新的数学发现,并导致全新学科的发展,例如物理学的实质性发展中建立的某些理论激发数学家对于某些问题的不同角度的思考。数学家也研究纯数学,就是数学本身的实质性内容,而不以任何实际应用为目标。虽然许多研究以纯数学开始,但其过程中也发现许多应用之处。
leetcode2 两数相加
leetcode96. 不同的二叉搜索树 动归vs数学?
博弈
SQL
大部分是付费题目,可以看我的做题记录,目前做了一半(50题),另一半我觉得做出来对我个人的提升较小了,所以暂时没有做。
leetcode184. 部门工资最高的员工(SQL) 连接+嵌套查询
leetcode570. 至少有5名直接下属的经理(SQL)
leetcode597. 好友申请 I :总体通过率(SQL)
leetcode1050. 合作过至少三次的演员和导演(SQL)
多线程
这一部分要了解,知道自己使用的语言的并发工具,再懂一点点操作系统的多线程知识,就可以做了,但是数量不多。
(多线程)leetcode1114. 按序打印 认识AtomicInteger
(多线程)leetcode1115. 交替打印FooBar 记得Thread.yield();
(多线程)leetcode1117. H2O 生成 认识Java中的PV原语
(多线程)leetcode1195. 交替打印字符串 最简单解法一个变量搞定
shell
用到的可以了解一下。
转载:https://blog.csdn.net/hebtu666/article/details/105030629