![](https://img-blog.csdnimg.cn/20200626085116579.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
leetcode刷题笔记
深度学习推荐算法
用技术提升美好事物发生的概率。
展开
-
B树、B+树详解
B-树,即为B树。因为B树的原英文名称为B-tree,目前理解B的意思为平衡。概念首先,B树不要和二叉树混淆,在计算机科学中,B树是一种自平衡树数据结构,它维护有序数据并允许以对数时间进行搜索,顺序访问,插入和删除。B树是二叉搜索树的一般化,因为节点可以有两个以上的子节点。[1]与其他自平衡二进制搜索树不同,B树非常适合读取和写入相对较大的数据块(如光盘)的存储系统。它通常用于数据库和文件系统。定义B树是一种平衡的多分树,通常我们说m阶的B树,它必须满足如下条件:每个节点最多只有m个子节点。每原创 2020-08-17 12:41:41 · 5178 阅读 · 1 评论 -
算法 - 其它
汉诺塔哈夫曼编码汉诺塔有三个柱子,分别为 from、buffer、to。需要将 from 上的圆盘全部移动到 to 上,并且要保证小圆盘始终在大圆盘上。这是一个经典的递归问题,分为三步求解:① 将 n-1 个圆盘从 from -> buffer② 将 1 个圆盘从 from -> to③ 将 n-1 个圆盘从 buffer -> to如果只有一个圆盘,那么只需要进行一次移动操作。从上面的讨论可以知道,an = 2 * an-1 + 1,显然 an = 2n..原创 2020-07-05 00:33:08 · 89 阅读 · 0 评论 -
算法 - 算法分析
数学模型1. 近似2. 增长数量级3. 内循环4. 成本模型注意事项1. 大常数2. 缓存3. 对最坏情况下的性能的保证4. 随机化算法5. 均摊分析ThreeSum1. ThreeSumSlow2. ThreeSumBinarySearch3. ThreeSumTwoPointer倍率实验数学模型1. 近似N3/6-N2/2+N/3 ~ N3/6。使用 ~f(N) 来表示所有随着 N 的增大除以 f(N) 的结果趋近于 1 的函数。2. 增长..原创 2020-07-05 00:31:24 · 165 阅读 · 0 评论 -
算法 - 栈和队列
栈1. 数组实现2. 链表实现队列栈public interface MyStack<Item> extends Iterable<Item> { MyStack<Item> push(Item item); Item pop() throws Exception; boolean isEmpty(); int size();}1. 数组实现public class ArrayStack<It..原创 2020-07-05 00:30:36 · 104 阅读 · 0 评论 -
算法 - 排序
约定选择排序冒泡排序插入排序希尔排序归并排序1. 归并方法2. 自顶向下归并排序3. 自底向上归并排序快速排序1. 基本算法2. 切分3. 性能分析4. 算法改进5. 基于切分的快速选择算法堆排序1. 堆2. 上浮和下沉3. 插入元素4. 删除最大元素5. 堆排序6. 分析小结1. 排序算法的比较2. Java 的排序算法实现约定待排序的元素需要实现 Java 的 Comparable 接口,该接口有 compareTo()..原创 2020-07-05 00:29:17 · 122 阅读 · 0 评论 -
算法 - 符号表
前言初级实现1. 链表实现无序符号表2. 二分查找实现有序符号表二叉查找树1. get()2. put()3. 分析4. floor()5. rank()6. min()7. deleteMin()8. delete()9. keys()10. 分析2-3 查找树1. 插入操作2. 性质红黑树1. 左旋转2. 右旋转3. 颜色转换4. 插入5. 分析散列表1. 散列函数2. 拉链法3. 线性探测法小结1. 符号表算..原创 2020-07-05 00:20:26 · 1318 阅读 · 0 评论 -
算法 - 并查集
前言Quick FindQuick Union加权 Quick Union路径压缩的加权 Quick Union比较前言用于解决动态连通性问题,能动态连接两个点,并且判断两个点是否连通。方法描述UF(int N)构造一个大小为 N 的并查集void union(int p, int q)连接 p 和 q 节点int find(int p)查找 p 所在的连通分量编号boolean connected(int p, int q)判断 p ..原创 2020-07-05 00:15:40 · 131 阅读 · 0 评论 -
Leetcode 目录
算法思想双指针排序贪心思想二分查找分治搜索动态规划数学数据结构相关链表树栈和队列哈希表字符串数组与矩阵图位运算原创 2020-07-02 10:14:39 · 148 阅读 · 0 评论 -
Leetcode-Database 题解
595. Big Countrieshttps://leetcode.com/problems/big-countries/description/Description+-----------------+------------+------------+--------------+---------------+| name | continent | area | population | gdp |+-------------原创 2020-07-02 10:09:17 · 1033 阅读 · 0 评论 -
Leetcode 题解 - 位运算
原理1. 基本原理0s 表示一串 0,1s 表示一串 1。x ^ 0s = x x & 0s = 0 x | 0s = xx ^ 1s = ~x x & 1s = x x | 1s = 1sx ^ x = 0 x & x = x x | x = x利用 x ^ 1s = ~x 的特点,可以将位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。利用 x &原创 2020-07-02 10:08:30 · 510 阅读 · 0 评论 -
Leetcode 题解 - 双指针
双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。有序数组的 Two SumLeetcode :167. Two Sum II - Input array is sorted (Easy)Input: numbers={2, 7, 11, 15}, target=9Output: index1=1, index2=2题目描述:在有序数组中找出两个数,使它们的和为 target。使用双指针,一个指针指向值较小的元素,一个指针指向值较大的元素。指向较小元素的指针从头向尾遍历,指向较原创 2020-07-02 10:07:29 · 168 阅读 · 0 评论 -
Leetcode 题解 - 数学
素数分解每一个数都可以分解成素数的乘积,例如 84 = 22 * 31 * 50 * 71 * 110 * 130 * 170 * …整除令 x = 2m0 * 3m1 * 5m2 * 7m3 * 11m4 * …令 y = 2n0 * 3n1 * 5n2 * 7n3 * 11n4 * …如果 x 整除 y(y mod x == 0),则对于所有 i,mi <= ni。最大公约数最小公倍数x 和 y 的最大公约数为:gcd(x,y) = 2min(m0,n0) * 3min(m1,n1原创 2020-07-01 12:06:25 · 1131 阅读 · 0 评论 -
Leetcode 题解 - 图
二分图如果可以用两种颜色对图中的节点进行着色,并且保证相邻的节点颜色不同,那么这个图就是二分图。判断是否为二分图785. Is Graph Bipartite? (Medium)Input: [[1,3], [0,2], [1,3], [0,2]]Output: trueExplanation:The graph looks like this:0----1| || |3----2We can divide the vertices into two groups: {0原创 2020-07-01 12:05:29 · 116 阅读 · 0 评论 -
Leetcode 题解 - 贪心思想
保证每次操作都是局部最优的,并且最后得到的结果是全局最优的。分配饼干455. Assign Cookies (Easy)Input: [1,2], [1,2,3]Output: 2Explanation: You have 2 children and 3 cookies. The greed factors of 2 children are 1, 2.You have 3 cookies and their sizes are big enough to gratify all of th原创 2020-07-01 12:04:46 · 289 阅读 · 0 评论 -
Leetcode 题解 - 搜索
深度优先搜索和广度优先搜索广泛运用于树和图中,但是它们的应用远远不止如此。BFS广度优先搜索一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。第一层:0 -> {6,2,1,5}第二层:6 -> {4}2 -> {}1 -> {}5 -> {3}第三层:4 -> {}3 -> {}每一层遍历的节点都与根节点距离相同。设 di 表示第 i 个节点与原创 2020-07-01 12:03:13 · 488 阅读 · 0 评论 -
Leetcode 题解 - 字符串
字符串循环移位包含编程之美 3.1s1 = AABCD, s2 = CDAAReturn : true给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环移位得到的字符串包含。s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。字符串循环移位编程之美 2.17s = "abcd123" k = 3Return "123abcd"将字符串向右循环移动 k 位。将 abcd123 中的 abcd 和 123 单独翻原创 2020-07-01 11:59:29 · 406 阅读 · 0 评论 -
Leetcode 题解 - 栈和队列
用栈实现队列232. Implement Queue using Stacks (Easy)栈的顺序为后进先出,而队列的顺序为先进先出。使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序。class MyQueue { private Stack<Integer> in = new Stack<>(); private Stack<Integer> out = new原创 2020-07-01 11:58:44 · 116 阅读 · 0 评论 -
Leetcode 题解 - 树
递归一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。树的高度104. Maximum Depth of Binary Tree (Easy)public int maxDepth(TreeNode root) { if (root == null) return 0; return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;}平衡树110. Balan原创 2020-07-01 11:57:49 · 350 阅读 · 0 评论 -
Leetcode 题解 - 排序
快速选择用于求解 Kth Element 问题,使用快速排序的 partition() 进行实现。需要先打乱数组,否则最坏情况下时间复杂度为 O(N2)。堆排序用于求解 TopK Elements 问题,通过维护一个大小为 K 的堆,堆中的元素就是 TopK Elements。堆排序也可以用于求解 Kth Element 问题,堆顶元素就是 Kth Element。快速选择也可以求解 TopK Elements 问题,因为找到 Kth Element 之后,再遍历一次数组,所有小于等于原创 2020-07-01 11:56:25 · 200 阅读 · 0 评论 -
算法 - 并查集
前言用于解决动态连通性问题,能动态连接两个点,并且判断两个点是否连通。方法描述UF(int N)构造一个大小为 N 的并查集void union(int p, int q)连接 p 和 q 节点int find(int p)查找 p 所在的连通分量编号boolean connected(int p, int q)判断 p 和 q 节点是否连通public abstract class UF { protected int[] id;原创 2020-07-01 11:55:02 · 86 阅读 · 0 评论 -
Leetcode 题解 - 链表
链表是空节点,或者有一个值和一个指向下一个链表的指针,因此很多链表问题可以用递归来处理。找出两个链表的交点160. Intersection of Two Linked Lists (Easy)A: a1 → a2 ↘ c1 → c2 → c3 ↗B: b1 → b2 → b3要求:时间复杂度为 O(N),空间复杂度为 O(1)设 A 的长度为 a原创 2020-06-30 12:51:21 · 276 阅读 · 0 评论 -
Leetcode 题解 - 哈希表
哈希表使用 O(N) 空间复杂度存储数据,并且以 O(1) 时间复杂度求解问题。Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中。如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在。例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组来存储一个字符集合,使得空间复杂度降低为 O(1)。Java 中的 HashMap 主要用于映射关系,从而把两个元素联系起来。HashMap 也可以用来对元素进行计数统计,此时键为元素,值为计数。和原创 2020-06-30 12:50:14 · 120 阅读 · 0 评论 -
Leetcode 题解 - 分治
1. 给表达式加括号241. Different Ways to Add Parentheses (Medium)Input: "2-1-1".((2-1)-1) = 0(2-(1-1)) = 2Output : [0, 2]public List<Integer> diffWaysToCompute(String input) { List<Integer> ways = new ArrayList<>(); for (int i =原创 2020-06-30 12:49:23 · 98 阅读 · 0 评论 -
Leetcode 题解 - 动态规划
递归和动态规划都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保存了子问题的解,避免重复计算。斐波那契数列爬楼梯70. Climbing Stairs (Easy)题目描述:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法。定义一个数组 dp 存储上楼梯的方法数(为了方便讨论,数组下标从 1 开始),dp[i] 表示走到第 i 个楼梯的方法数目。第 i 个楼梯可以从第 i-1 和 i-2 个楼梯再走一步到达,走到第 i 个楼梯的方法数为走到第 i-1 和第 i-原创 2020-06-30 12:42:39 · 1018 阅读 · 0 评论 -
Leetcode 题解 - 数组与矩阵
1. 把数组中的 0 移到末尾283. Move Zeroes (Easy)For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].public void moveZeroes(int[] nums) { int idx = 0; for (int num : nums) { if (num != 0) {原创 2020-06-30 12:38:09 · 209 阅读 · 0 评论 -
Leetcode题解 二分查找
原理1. 正常实现public int binarySearch(int[] nums, int key) { int l = 0, h = nums.length - 1; while (l <= h) { int m = l + (h - l) / 2; if (nums[m] == key) { return m; } else if (nums[m] > key) { h原创 2020-06-30 12:36:19 · 3613 阅读 · 12 评论 -
字符串相关
字符串查找KMP 算法谈到字符串问题,不得不提的就是 KMP 算法,它是用来解决字符串查找的问题,可以在一个字符串(S)中查找一个子串(W)出现的位置。KMP 算法把字符匹配的时间复杂度缩小到 O(m+n) ,而空间复杂度也只有O(m)。因为“暴力搜索”的方法会反复回溯主串,导致效率低下,而KMP算法可以利用已经部分匹配这个有效信息,保持主串上的指针不回溯,通过修改子串的指针,让模式串尽量地移动到有效的位置。替换空格剑指offer:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当原创 2020-06-28 08:43:56 · 252 阅读 · 0 评论 -
图算法
图的定义和常用术语图是一系列顶点(结点)和描述顶点之间的关系边(弧)组成。图是数据元素的集合,这些数据元素相互连接形成网络。其形式化定义为:G=(V,E)。其中,G表示图,V是顶点的集合,E是边或弧的集合。并且E可以表示为:E=(Vi,Vj),表示顶点Vi和Vj之间有边或弧相连。顶点集:图中具有相同特性的数据元素的集合;边(弧):边是一对顶点间的路径,通常带箭头的边称为弧;度:在无向图中顶点的度是指连接那个顶点的边的数目。在有向图中,每个顶点有两种类型的度(入度、出度);入度:指向原创 2020-06-28 08:42:50 · 212 阅读 · 0 评论 -
常用数据结构特点
数组、链表的优缺点数组的优缺点数组的优点在于:构建非常简单能在 O(1) 的时间里根据数组的下标(index)查询某个元素而数组的缺点在于:构建时必须分配一段连续的空间查询某个元素是否存在时需要遍历整个数组,耗费 O(n) 的时间(其中,n 是元素的个数)删除和添加某个元素时,同样需要耗费 O(n) 的时间链表的优缺点链表的优点如下:链表能灵活地分配内存空间;能在 O(1) 时间内删除或者添加元素,前提是该元素的前一个元素已知,当然也取决于是单链表还是双链表,在双链表中,如原创 2020-06-28 08:42:04 · 2354 阅读 · 0 评论 -
排序算法
排序算法说明排序的定义对一序列对象根据某个关键字进行排序。术语说明稳定 :如果a原本在b前面,并且a=b,则排序之后a仍然在b的前面;不稳定 :如果a原本在b的前面,而a=b,则排序之后a可能会出现在b的后面;内排序 :所有排序操作都在内存中完成;外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;时间复杂度 : 一个算法执行所耗费的时间。空间复杂度 :运行完一个程序所需内存的大小。算法复杂度总结图片名词解释:n: 数据规模k: “桶”的个原创 2020-06-28 08:41:02 · 124 阅读 · 0 评论 -
基本数据结构
常用的数据结构可根据数据访问的特点分为线性结构和非线性结构。线性结构包括常见的链表、栈、队列等,非线性结构包括树、图等。数组数组可以说是最基本最常见的数据结构。数组一般用来存储相同类型的数据,可通过数组名和下标进行数据的访问和更新。数组中元素的存储是按照先后顺序进行的,同时在内存中也是按照这个顺序进行连续存放。数组相邻元素之间的内存地址的间隔一般就是数组数据类型的大小。链表链表相较于数组,除了数据域,还增加了指针域用于构建链式的存储数据。链表中每一个节点都包含此节点的数据和指向下一节点地址的.原创 2020-06-28 08:40:08 · 346 阅读 · 1 评论 -
二叉树
二叉树的定义二叉树(Binary Tree)二叉树(Binary Tree)是有限个节点的集合,这个集合可以是空集,也可以是一个根节点和两颗不相交的子二叉树组成的集合,其中一颗树叫根的左子树,另一颗树叫右子树。所以二叉树是一个递归地概念。满二叉树(Full Binary Tree)一棵满二叉树就是高度为k,且拥有(2^k)-1个节点的二叉树,一棵满二叉树每个节点,要么都有两棵子树,要么都没有子树;而且每一层所有的节点之间必须要么都有两棵子树,要么都没子树。完全二叉树(Complete Binary原创 2020-06-28 08:38:38 · 170 阅读 · 0 评论 -
查找算法
查找算法说明查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。查找算法分类:静态查找和动态查找注:静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。无序查找和有序查找无序查找:被查找数列有序无序均可有序查找:被查找数列必须为有序数列平均查找长度(Average Search Length,ASL):需和指定key进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。对于含有n个数据元素的查找表,查找原创 2020-06-28 08:37:59 · 126 阅读 · 0 评论 -
剑指offer解题笔记
求职在即,《剑指offer》作为大家都推荐的一本应试宝典算法相关资料,确实也有刷一刷的必要。很多题目都比较经典,也涵盖了大多数的算法和数据结构。把自己刷题的过程做一个总结,权当是一个笔记。下面为本人在LeetCode上面刷的题目笔记,给出所有代码为本人提交Accepted后记录。数组中重复的数字题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组原创 2020-06-17 19:19:38 · 649 阅读 · 26 评论 -
leetcode刷题笔记——树
1.合并二叉树水题QAQ递归方法:我们可以对这两棵树同时进行前序遍历,并将对应的节点进行合并。在遍历时,如果两棵树的当前节点均不为空,我们就将它们的值进行相加,并对它们的左孩子和右孩子进行递归合并;如果其中有一棵树为空,那么我们返回另一颗树作为结果;如果两棵树均为空,此时返回任意一棵树均可(因为都是空)。2.二叉树的直径假设我们知道对于该节点的左儿子向下遍历经过最多的节点数 LL(即以左儿子为根的子树的深度) 和其右儿子向下遍历经过最多的节点数 RR (即以右儿子为根的.原创 2020-05-28 16:02:12 · 150 阅读 · 0 评论 -
leetcode刷题笔记
1. 两数之和题解很棒,最好能说明一下为什么不怕重复造成hash冲突(重复值只能存入一个)。 在这里记录一下:1.每次写入时,判断条件为 key和 tag 之间的差值存不存在。2.题目命题说明了一点,假定只有一个解。也就是说重复元素再多都无所谓。 case 1:如果有3个或者以上的重复元素,代表这个重复元素不可能是解,所以写入map的时候直接覆盖也无所谓; case2:如果只有两个重复元素,同样的道理,假如这个重复元素是解,那么必定是两个重复元素的和等于tag。这种情况下,当遇到第二个重复元素.原创 2020-05-20 19:19:24 · 186 阅读 · 0 评论