数据结构
文章平均质量分 81
周末的丢
这个作者很懒,什么都没留下…
展开
-
关于哈希表,你需要知道这些
一、哈希表顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( ),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法: 可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一...原创 2019-11-24 21:39:22 · 355 阅读 · 0 评论 -
关于二叉搜索树,你需要知道这些
二叉搜索树:针对任何一颗子树来说都要满足,父节点>左子树,父节点<右子树。(父节点是中间大小的元素。堆:父节点和子节点中间的关系,堆顶元素一定是最大值或者最小值二叉搜索树中序遍历的结果是一个有序的序列具体实现主要有三个核心操作(增删查),对于二叉搜索树,修改操作不能针对key进行修改package package1123;public class BinarySea...原创 2019-11-23 21:28:45 · 269 阅读 · 0 评论 -
旧键盘(坏键盘打字)
题目网址:https://www.nowcoder.com/questionTerminal/f88dafac00c8431fa363cd85a37c2d5e旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有...原创 2019-11-21 20:47:45 · 266 阅读 · 1 评论 -
前K个高频单词
题目:给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。事例:[“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2 输出: [“i”,“love”] 解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。注意,按字母顺...原创 2019-11-20 21:23:05 · 273 阅读 · 4 评论 -
复制带随机指针的链表
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。深拷贝的意思是两个引用,分别指向到两个对象,但是这两个对象里面的内容是一样的浅拷贝的意思是两个引用,指向的是同一个对象这里我们采用一个比较灵活的思路:1.创建一个HashMap,key存的是原链表的结点,value存的是新链表的结点,这两个结点是对称的。2.把旧链表的结...原创 2019-11-20 20:02:29 · 166 阅读 · 1 评论 -
只出现一次的数字(Map试题)
题目网址:https://leetcode-cn.com/problems/single-number/跟我之前写的一篇文件类似,揪出单身狗这道题的题目也是类似题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。例如输入: [2,2,1]输出: 1方法一:按位异或的方法:根据题目的特殊性,只有一个元素出现一次,其余元素...原创 2019-11-20 19:23:29 · 164 阅读 · 0 评论 -
10分钟学会七大排序(2)
五、冒泡排序public void bubbleSort(int[] array){ for (int bound = 0; bound < array.length; bound++) { for (int cur = array.length - 1; cur > bound ; cur--) { if(ar...原创 2019-11-18 20:03:50 · 194 阅读 · 0 评论 -
10分钟学会七大排序(1)
一、插入排序直接插入排序-原理:整个区间被分为有序区间无序区间每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入具体实现的代码如下:import java.util.Arrays;public class SortDemo { public static void insertSort(int[] array){ //[0,bound)为拍好序的...原创 2019-11-17 16:04:41 · 251 阅读 · 2 评论 -
迭代法遍历二叉树
不用递归的方法取遍历二叉树https://leetcode-cn.com/problems/binary-tree-preorder-traversal/先序遍历思路如下:先创建一个栈把根节点入栈循环取栈顶的元素并且访问它把当前元素的右子树和左子树分别入栈/** * Definition for a binary tree node. * public class Tree...原创 2019-11-12 02:55:41 · 532 阅读 · 1 评论 -
Top K问题+查找和最小的k对数字
比如给你一个很大的数据,让你找前1000大的数据遍历数据,和擂台上的最小值,如果比最小值大,把原来的最小值淘汰掉,把当前数据加入擂台。擂台就是一个小堆,很方便找到最小值。为了更好的理解这个例子:我在下面画图说明。例如有这么一组数据{1,2,3,4,5,6,7,8},我们要找这组数据前三的数据首先第一步,我们创建一个擂台,也就是堆,这个擂台放三个人,例如1,2,3三个人先打比赛了,就上去了...原创 2019-11-11 19:40:38 · 205 阅读 · 1 评论 -
关于优先级队列(堆),你需要知道这些
1、二叉树的存储顺序1.1存储方式使用数组保存二叉树结构,方式即将二叉树用层序遍历方式放入数组中。一般只适合表示完全二叉树,因为非完全二叉树会有空间的浪费。这种方式的主要用法就是堆的表示。1.2.下标关系已知双亲(parent)的下标,则:左孩子(left)下标 = 2 * parent + 1;右孩子(right)下标 = 2 * parent + 2;已知孩子(不区...原创 2019-11-11 16:15:43 · 583 阅读 · 1 评论 -
根据二叉树创建字符串
题目网址:https://leetcode-cn.com/problems/construct-string-from-binary-tree/你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。/** * Definition for a binary tree node. * public class TreeNode { * int val; * ...原创 2019-11-10 19:58:10 · 229 阅读 · 0 评论 -
根据一棵树的前序遍历与中序遍历构造二叉树。(中序和后序呢)
已知一颗树的先序和中序遍历结果,我们是可以构造唯一的一颗二叉树/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } *...原创 2019-11-10 18:50:55 · 714 阅读 · 1 评论 -
二叉树搜索树转换成排序双向链表。
二叉搜索树是一种特殊的二叉树,为了加快搜索有点类似二分查找的方法,左子树的值小于根节点的值,根节点的值小于右子树的值二叉树的中序遍历结果是有序的。用left表示prev,right表示next/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;...原创 2019-11-10 17:29:55 · 140 阅读 · 1 评论 -
二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。如果从最近公共祖先找两个指定节点:这两个指定节点一定不在同一个子树中。这道题有点神奇,要找最近公共祖先,我们从树的根节点往下操作我们设一个辅助方法(Boolean)帮我们找指定节点,如果找到了,返回1逼近条件:root为空时,不会包含任何节点,返回null深陷递归,如果当前节点为指定节点,说明找到了(否则遍历左子树,右子树)...原创 2019-11-10 15:28:33 · 110 阅读 · 0 评论 -
二叉树的分层遍历
给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。[3,9,20,null,null,15,7](层序)遍历结果[[3],[9,20],[15,7]]这个问题和层序遍历不一样,之前我们用的层序遍历打印是用一个队列来实现将根节点放入队列,取出首元素访问他,将他的左右子树添加到队列(要不为空才能添加)直到容器为空。这样就实现了层序的效果但是这...原创 2019-11-10 14:13:01 · 187 阅读 · 1 评论 -
根据前序的字符串创建出二叉树
题目网址:https://www.nowcoder.com/questionTerminal/4b91205483694f449f94c179883c1fef编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,...原创 2019-11-10 13:29:28 · 3171 阅读 · 1 评论 -
设计循环队列
public class MyCircularQueue { int[] dates; private int head = 0; private int tail = 0; private int size = 0; /** Initialize your data structure here. Set the size of the queue to...原创 2019-11-09 22:58:12 · 115 阅读 · 0 评论 -
求一棵树的坡度
题目网址:https://leetcode-cn.com/problems/binary-tree-tilt/submissions/给定一个二叉树,计算整个树的坡度。一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。整个树的坡度就是其所有节点的坡度之和我将这题分为三个简单的方法第一个方法:要求一个树的总坡度,我将其大事化小,化为 根节点...原创 2019-11-07 08:53:35 · 220 阅读 · 0 评论 -
判断一棵树是不是完全二叉树(两个阶段)
判断一棵树是不是完全二叉树对二叉树进行层序遍历遍历过程中,状态分成两个阶段a)第一阶段,每个节点都有两个子树b)第二阶段,遇到一个特殊的节点,可能只有左子树可能没有子树,就开启第二阶段(这个临界节点如果是有右子树,没有左子树,那么说明一定不是完全二叉树)c)第二阶段中,接下来每个节点都必须没有子树,如果要是有子树,就不是完全二叉树public boolean isComplete(...原创 2019-11-06 20:18:38 · 220 阅读 · 0 评论 -
层序遍历二叉树
层序遍历层序遍历的核心思路:需要一层一层的访问,一层访问完毕,再访问下一层,借助一个队列创建一个队列辅助进行遍历先把root插入队列循环取队首元素,访问这个元素把当前这个队首元素左子树和右子树都插入队列中重复执行3遍历到队列为空就结束了public void levelOrder(TreeNode root){ if(root == null){ ...原创 2019-11-06 19:50:54 · 255 阅读 · 0 评论 -
判断是不是对称二叉树,旋转二叉树
给定一个二叉树,检查它是否是镜像对称的。思路:判断一棵树是不是对称的,可以看看左右子树是不是镜像关系如果是空树,是对称接着判断左右子树是不是对称的2.1如果两个树都是空树,是镜像2.2,如果一个空一个非空,不算镜像2.3如果两棵树都不为空a)比较根节点是否相同,不相同,不是镜像b)递归比较子树,t1.left 和t2.right ,再看 t1.right和t2.left是不是...原创 2019-11-05 22:30:08 · 139 阅读 · 1 评论 -
判断是否是平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。对于每一个结点来说都要满足左右子树深度之差 <= 1思路:如果是空树,算平衡如果没有子树,也算平衡求一下左右子树的高度,判断一下差值是否小于1,不满足return false递归判定左子树右子树是不是也是平衡/** * Defin...原创 2019-11-05 19:54:42 · 144 阅读 · 1 评论 -
求二叉树的最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。借助递归把问题拆分1+左子树的最大深度+右子树的最大深度 的最大值1.空树,深度为02.只有一个根节点,没有左右子树,深度13.1 + max(左子树的深度+右子树的深度)/** * Definition for a binary tree node. * public class Tree...原创 2019-11-05 18:32:53 · 420 阅读 · 0 评论 -
判断一颗树是不是另一棵树的子树
s为大树,t为小树给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。题目网址:https://leetcode-cn.com/problems/subtree-of-another-tree/思路:两个树都是空树,返回true如果两个树一个是空,一个不是空,不包...原创 2019-11-05 18:06:54 · 600 阅读 · 2 评论 -
给定两个二叉树,判断它们是否相同
题目网址:https://leetcode-cn.com/problems/same-tree/思路如下1.如果两棵树都是空树,直接返回true2.一棵树为空一棵树不为空,返回false3.如果都不为空树a)比较根节点的值是否相同,如果不相同返回falseb)递归比较左子树和比较右子树是否相同大事化小判定两棵树是否相同=> 比较根节点是否相同+比较左子树右子树是否相同/**...原创 2019-11-05 17:21:48 · 841 阅读 · 1 评论 -
关于二叉树,你需要知道这些。
什么是树树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。例如我画这么一颗树节点的度:一个节点含有的子树的个数称为该...原创 2019-11-03 21:54:23 · 523 阅读 · 1 评论 -
实现一个最小栈
题目网址:https://leetcode-cn.com/problems/min-stack/设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。常数时间的意思是时间复杂度是O(1);思路是:用空间换时间,用额外的空间把最小的元素提取保存好我们创建两个栈,A和BA用来表示栈中的数据B专门用来存当前栈对应的最小值。AB两个栈,第一次push时,A和B都...原创 2019-11-03 19:27:54 · 198 阅读 · 1 评论 -
用栈实现队列
题目网址:https://leetcode-cn.com/problems/implement-queue-using-stacks/这题的思路与”用队列实现栈“是类似的。这里我们需要两个栈来辅助我们实现队列,两个栈分别是A和BA栈:负责入队列操操作,B栈负责出队列操作入队列操作:需要先判断一下B是不是空栈,如果是空栈,就直接push,如果不是空,就需要将B的元素push到A中,保持原有队...原创 2019-11-03 18:28:40 · 131 阅读 · 2 评论 -
用队列实现栈
题目网址:https://leetcode-cn.com/problems/implement-stack-using-queues/我们知道栈的出入栈方式是:后进先出队列的方式是:先进先出让队列实现栈,我们就需要用到两个队列了。这里我们创建两个队列A,B我这里直接用链表来实现 LinkedList<Integer> A = new LinkedList<>()...原创 2019-11-02 17:14:48 · 197 阅读 · 2 评论 -
有效的括号
题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。实例1:输入: “()”输出: true实例2:输入: “()[]{}”输出: true实例3:输入: “(]”输出: false实例4:...原创 2019-11-01 19:29:26 · 99 阅读 · 0 评论 -
关于队列,你需要知道这些
队列:先进先出队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First InFirst Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头。队列也是一种特殊的线性表也是只支持三个核心操作入队列出队列取队首元素队列的一些进化版本:1.优先队列。2.消息队列。给每个数据引入了...原创 2019-11-01 19:02:21 · 336 阅读 · 1 评论 -
关于栈,你需要知道这些
分别用四个字描述栈和队列栈:后进先出队列:先进先出栈栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。它的三个核心操作入栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。(最后吃的在肚子上面)出栈:栈的删除操作叫做出栈。出数据在栈顶...原创 2019-11-01 17:43:41 · 192 阅读 · 1 评论 -
杨辉三角
在线OJ网址https://leetcode-cn.com/problems/pascals-triangle/杨辉三角我们都很了解了,现在我们要编写这么一个程序,例如在这里我们输入5就会输出一个5行的杨辉三角如下这道题的思路我分为一下几个步骤合法性判断,如果输入的行数小于0,返回一个空链表第一行永远等于1,如果输入行数为1,则输出为1第二行永远是两个1,如果输入行数为2,则输入,...原创 2019-11-01 16:48:25 · 479 阅读 · 1 评论 -
关于List的常用方法和扑克牌练习
package package10_29;import java.util.ArrayList;import java.util.List;public class TestList { public static void main(String[] args) { //1.创建list的实例 List<String> list = ...原创 2019-10-29 19:57:40 · 265 阅读 · 0 评论 -
删除链表的倒数第k个节点
题目网址:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/submissions//** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * Li...原创 2019-10-27 17:35:12 · 206 阅读 · 0 评论 -
双向带环带头节点的链表
创建一个双向链表的节点:class ListNode { public int val; public ListNode next = null; public ListNode prev = null; public ListNode(int val) { this.val = val; }}关于头插:public void a...原创 2019-10-13 13:12:55 · 128 阅读 · 1 评论 -
找出链表的公共节点k
1.两个链表不带环,并且不相交2.两个链表不带环,相交3.两个链表带环,不相交4.一个链表带环,一个不带环(一定不相交)5.都带环,相交,有一个交点(环外相交)6.都带环,相交,有两个交点(环上相交)1.先判定两个是否带坏(图12)如果都不带环,转换成最初的判定相交问题(分别求长度,长的先走差值步)2.如果一个带环一个不带环(图4)直接认为不相交3.如果两个都带环,...原创 2019-10-12 14:02:22 · 219 阅读 · 0 评论 -
给定一个链表,判断链表中是否有环,有的话返回环的入口节点
题目网址:https://leetcode-cn.com/problems/linked-list-cycle/基本思路,我们采用快慢指针的方法,快指针一次走两步,慢指针一次走一步。如果链表不带环,快指针一定会先到达末尾如果链表带环,快指针一定会和慢指针重合。时间复杂度? O(N)空间复杂度?O(1)具体实现代码:/** * Definition for singly-linke...原创 2019-10-12 13:08:14 · 1042 阅读 · 2 评论 -
10分钟学会链表!
链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。链表分为是否带头节点,是否带环,是单向还是双向不带头,不带环的单向链表:笔试面试中出场率最高不带头节点,与带头节点,我画了张图说明傀儡结点存在的意义是让代码编写起来更方便。关于无环链表和双向链表关于链表大致要实现一下几个功能(无头单向非循环)// 1、无头单向非循环链表实现public ...原创 2019-09-27 01:56:17 · 337 阅读 · 0 评论