数据结构和算法
回首往昔少年
这个作者很懒,什么都没留下…
展开
-
二分查找
参考liweiwei1419的讲解思路一:在循环体中查找元素先看位于数组中间的那个元素的值:如果中间的那个元素正好等于目标元素,我们就可以直接返回这个元素的下标;否则我们就需要在中间这个元素的左边或者右边继续查找。public class Solution { // 「力扣」第 704 题:二分查找 public int search(int[] nums, int target) { int len = nums.length;转载 2020-09-26 15:14:07 · 170 阅读 · 0 评论 -
力扣刷题——双指针
有序数组的 Two Sum力扣167Input: numbers={2, 7, 11, 15}, target=9Output: index1=1, index2=2使用双指针,一个指针指向值较小的元素,一个指针指向值较大的元素。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。如果两个指针指向元素的和 sum == target,那么得到要求的结果;如果 sum > target,移动较大的元素,使 sum 变小一些;如果 sum < target,移动较小的元原创 2020-09-08 08:28:04 · 259 阅读 · 0 评论 -
字符串相关
两个字符串包含的字母是否完全相同力扣242由于本题的字符串只包含 26 个小写字符,因此可以使用长度为 26 的整型数组对字符串出现的字符进行统计,不再使用 HashMap。class Solution { public boolean isAnagram(String s, String t) { int[] num = new int[26]; for (char c : s.toCharArray()) { num[c - 'a']原创 2020-08-29 23:41:06 · 248 阅读 · 0 评论 -
将BST变平衡(手撕AVL树)
力扣1382什么是平衡二叉树(AVL)——知乎[平衡二叉树(博客园)](https://www.cnblogs.com/huangxincheng/archive/2012/07/22/2603956.html)强调,手撕AVL并不是最优解,只是通解,时间复杂度是nlog(n)。利用二叉搜索树的性质,中序遍历输出,然后以中间为root,递归构造树,效率更高,算是本题的最优解。提交时发现,必须初始化叶子节点高度为1,0也不行public AVLNode(int val){ this原创 2020-08-22 10:57:30 · 494 阅读 · 0 评论 -
栈和队列
用栈实现队列leetcode232栈的顺序为后进先出,而队列的顺序为先进先出。使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序。class MyQueue { private Stack<Integer> in; private Stack<Integer> out; /** Initialize your data structure here. */原创 2020-08-22 09:55:01 · 150 阅读 · 0 评论 -
回溯入门问题——全排列
全排列(Medium)力扣46class Solution { private List<List<Integer>> res = new LinkedList<>(); public List<List<Integer>> permute(int[] nums) { LinkedList<Integer> track = new LinkedList<>(); dfs(转载 2020-08-18 11:39:30 · 136 阅读 · 0 评论 -
字符串查找——初窥KMP算法
参考知乎参考bilibiliKMP算法的核心,是一个被称为**部分匹配表(Partial Match Table)**的数组。我觉得理解KMP的最大障碍就是很多人在看了很多关于KMP的文章之后,仍然搞不懂PMT中的值代表了什么意思。这里我们抛开所有的枝枝蔓蔓,先来解释一下这个数据到底是什么。对于字符串“abababca”,它的PMT如下表所示:就像例子中所示的,如果待匹配的模式字符串有8个字符,那么PMT就会有8个值。字符串前缀和后缀:如果字符串A和B,存在A=BS,其中S是任意的非空字符串,原创 2020-08-10 21:53:50 · 220 阅读 · 0 评论 -
二叉树
文章目录deque与链表、栈、队列的关系树的高度deque与链表、栈、队列的关系在Java中,我们用Deque可以实现Stack的功能,注意只调用push()/pop()/peek()方法,避免调用Deque的其他方法。我们可以发现Deque是继承自Queue,而Stack是继承自Vector,这就比较奇怪了。Vector是由数组实现的集合类,他包含了大量集合处理的方法。而Stack之所以继承Vector,是为了复用Vector中的方法,来实现进栈(push)、出栈(pop)等操作。这里就是S原创 2020-08-08 22:53:30 · 275 阅读 · 0 评论 -
关于二叉树的度
首先说说什么是度:通俗的讲二叉树中连接节点和节点的线就是度,有n个节点,就有n-1个度,节点数总是比度要多一个,那么度为0的节点一定是叶子节点,因为该节点的下面不再有线;度为1的节点即:该节点只有一个分支;同理度为2的节点就是有两个分支。在二叉树中不可能存在度为3或大于3的节点!关于度和节点之间的关系还有很多公式:度为0的节点数为度为2的节点数加1,即n0=n2+1这个公式的推理方法如下:设:k:总度数k+1:总节点数n0:度为0的节点n1:度为1的节点n2:度为二的节点根据二叉树中度和节转载 2020-07-27 23:07:50 · 16784 阅读 · 3 评论 -
红黑树的两种介绍方法
红黑树有两种版本,《算法导论》中的红黑树有以下5个特点所有节点红色或黑色根结点黑色每个叶子节点都是黑色的空节点(NIL节点)红色节点的两个子节点为黑色的空节点(从每个叶子到根的所有路径上不能有两个连续的红节点)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点《算法》第四版中是这样定义的红链接均为左链接没有任何一个结点同时和红链接相连任意空链接到根结点的路径上的黑链接数量相同...原创 2020-06-01 15:27:37 · 177 阅读 · 0 评论 -
十大排序算法总结
文章目录0、排序算法说明0.1 排序的定义0.2 术语说明0.3 算法总结0.5 算法分类0.6 比较和非比较的区别1、冒泡排序(Bubble Sort)1.1 算法描述1.2 动图演示1.3 代码实现1.4 算法分析2、选择排序(Selection Sort)2.1 算法描述2.2 动图演示2.3 代码实现2.4 算法分析3、插入排序(Insertion Sort)3.1 算法描述3.2 动图演...转载 2019-12-24 10:54:35 · 255 阅读 · 0 评论 -
二项队列
更多内容参考这篇文章数据结构–二项队列分析及实现众所周知,只需要一个数组,我们就能实现二叉堆。二叉堆的Insert,DeleteMin均能以 O(logN) 执行,BuildHeap 和 Merge 能够以 O(logN) 执行。为了降低 Merge 复杂度,人们不得不使用指针,这就诞生了左式堆。左式堆本质上是一个二叉树,斜堆是左式堆的一个变体,各方面性能和左式堆相似。左式堆(lefti...原创 2019-12-22 15:43:09 · 525 阅读 · 1 评论 -
斜堆
1 斜堆定义:斜堆是具有堆序性的二叉树, 与左式堆的差别在于没有零路径属性,故 merge操作后,不需要考虑左右子堆的零路径大小,而是无条件交换左右子堆;(干货——斜堆定义)1.1)定义:斜堆(Skew heap)也叫自适应堆(self-adjusting heap),它是左式堆的一个变种。和左式堆一样,它通常也用于实现优先队列。它的合并操作的时间复杂度也是O(log n)。1....转载 2019-12-19 22:00:17 · 1557 阅读 · 0 评论 -
左式堆
1 相关定义1.1 零路径长度定义:到没有两个儿子的节点最短距离, 即零路径长Npl 定义为 从 X 到一个没有两个儿子的 节点的最短路径的长;也即, 非叶子节点到叶子节点的最少边数,其中NULL的零路径长为-1, 叶子节点的零路径长为0;(零路径长的定义—— 非叶子节点到叶子节点的最少边数,非常重要,因为左式堆的定义是基于零路径长的定义的)1.2 左式堆定义:一棵具有堆序性质的二叉树...转载 2019-12-19 14:04:49 · 1161 阅读 · 1 评论 -
算法性能分析
性能分析的角度一般我们从时间复杂度和空间复杂度两个方面对算法的效率进行分析。一.时间复杂度(Time Complexity)我们通常将时间复杂度记为:T(n)=O(f(n))我们将此式分为三个部分进行讲述。T(n):算法的渐近时间复杂度,简称时间复杂度。f(n):算法中语句中执行次数最多的语句的频度。O():计算数量级。数学表达式为:存在正常数C和n0,当n>=n0时,...转载 2019-12-13 20:17:29 · 706 阅读 · 0 评论 -
背包、队列和栈
Java中的Iterable与Iterator详解文章目录算术表达式求值迭代栈能够动态调整数组大小的实现(LIFO)对象游离链表实现(LIFO)队列背包三种数据类型:背包(Bag)、队列(Queue)和栈(Stack)。它们的不同之处就在于删除或者访问对象的顺序不同。算术表达式求值E.W.Dijkstra 发明了一个非常简单的算法,用到了两个栈(操作数栈、运算符栈)。具体思路:将操作数...原创 2019-12-07 21:21:32 · 189 阅读 · 0 评论