
数据结构
文章平均质量分 81
数据结构
一朵花花
女孩子也可以好好敲代码丫
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
初识哈希表【数据结构】
哈希表概念哈希冲突哈希冲突处理方法:概念前言举例:给定多干个整数[0,99],在给定一个数字 n,判断 n 是否出现在刚才的集合中1.基于顺序表: 可以用一个数组保存若干个整数,拿着 n 在数组中依次遍历,进行比较 — O(N)2.基于链表: 可以用一个链表保存若干个整数,拿着 n 在链表中依次遍历,进行比较 — O(N)3.基于二叉搜索树: 可以用一个二叉搜索树来保存这些整数,按照二叉搜索树的方式进行查找比较 — O(N) (比较理想的情况:OlogN)更高效的办法: 仍然创建一个 bo原创 2021-11-05 20:36:34 · 2134 阅读 · 3 评论 -
二叉树的三种非递归遍历方式
前言:在之前,我们写到了二叉树的递归 先、中、后序的遍历方式,今天,来讨论这三种遍历方式的非递归实现!!先序遍历思路: 类似于层序遍历创建一个栈,先把根节点入栈循环取栈顶元素,并访问(打印)把当前节点的左 / 右子树分别入栈当栈为空时,遍历结束代码实现:public List<Integer> preorderTraversal(Node root) { List<Integer> result = new ArrayList<>();原创 2021-11-04 12:56:50 · 503 阅读 · 4 评论 -
二叉搜索树 【数据结构】
二叉搜索树概念特点基本操作1.插入元素2.查找元素3.删除元素概念二叉搜索树是一种特殊的二叉树特点左子树中的值都小于根节点,右子树中的值都大于根节点故:中序遍历结果就会得到一个有序序列最大的特点:就是能够高效的进行查找元素查找过程类似于二分查找:先从根节点出发开始比较,看待查找元素是小于根节点还是大于根节点,进一步决定是去左子树中找,还是右子树查找的时间复杂度:O(N) (单支树)解决方案:采取更加平衡的二叉搜索树,AVL树(绝对平衡),红黑树基本操作1.插入元素其实和查找非常相似,原创 2021-11-01 20:51:04 · 7769 阅读 · 21 评论 -
Map 和 Set 【数据结构】
Map 和 Set1.标准库:TreeSet,TreeMap,HashSet,HashMap2.二叉搜索树:对应TreeSet TreeMap 底层实现3.哈希表:对应 HashMap,HashTree 底层实现搜索Map 和 Set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关模型一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为 Key-value 的键值对,所以模型会有两种纯 key 模型 :即,我们 Set 要解决的原创 2021-10-26 17:35:35 · 691 阅读 · 14 评论 -
Java对象的比较【数据结构】
对象比较:1.比较身份 ==2.比较值 equals(通过用户手动重写,才能够按照值比较)equals若没有手动重写,默认执行的就是object版本中的equals,比较规则也是在比较身份3.比较类型 instanceof原创 2021-10-24 08:00:00 · 787 阅读 · 13 评论 -
排序【数据结构】
排序 概念:排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作排序规则:一般是升序降序排列,若待排序元素比较复杂,就会有更复杂的排序方式常见排序算法:插入排序:直接插入排序插入排序基于顺序表的插入来实现的直接插入排序的基本操作是将一个记录插入到已排好序的有序表里,从而得到一个新的、记录数+1的有序表时间复杂度 —— O(N2)空间复杂度 —— O(1)稳定性: 稳定排序举例:代码示例:public static void insertSo原创 2021-10-22 10:36:26 · 1226 阅读 · 36 评论 -
两数相加【力扣】
题目: 在线OJ思考分析:首先,创建一个newHead,表示目标链表我们可以看作两个链表长度一样,在短的链表末尾补0创建变量 carry 记录进位值,遍历两个链表,逐位计算和 sum = num1 + num2 + carry注意: 最后要判断 carry > 0 ? 若还有进位值,则要将其附加在链表结尾代码实现:public ListNode addTwoNumbers2(ListNode l1, ListNode l2) { ListNode newHead = new L原创 2021-10-17 08:30:00 · 187 阅读 · 4 评论 -
优先级队列-堆【数据结构】
前言:我们之前学习的普通的队列,元素是先进先出;而优先级队列,是按照顺序进,优先级最高的先出队列,优先级相同再遵循先进先出优先级队列,名字叫队列,本质上是一个特殊的二叉树(堆)举例:幼儿园放学时,家长去接娃,整整齐齐的排着队等着进去接娃,突然来了一位校领导进学校有事….二叉树的顺序存储之前我们学习了二叉树的表示方法:左右孩子表示法,每个节点均记录左右子树的根节点引用除此之外,我们也可以使用数组来表示一棵树使用数组存储这棵树的层序变量结果(包含空节点)但是,使用数组来表示树,可能会原创 2021-10-16 16:44:09 · 1021 阅读 · 26 评论 -
二叉树相关面试题【数据结构】
题目基础面试题二叉树的前序遍历二叉树的中序遍历进阶面试题基础面试题二叉树的前序遍历题目:在线OJ思考:首先,我们要了解,前序遍历就是按照顺序:根节点—左子树—右子树的方式遍历树(根左右)在访问左右子树的时候,按照上述同样的方法遍历,因此我们可以考虑使用模拟递归来解决创建一个 List,将根节点的元素加入到 List 中递归遍历左子树,把左子树的遍历结果加入到 List 中递归遍历右子树,把右子树的遍历结果加入到 List 中最后返回这个 List 即可代码实现:public L原创 2021-10-10 21:59:54 · 1461 阅读 · 35 评论 -
树及二叉树【数据结构】
树形结构我们之前研究的基本都是一对一的问题,而树是一种非线性数据结构,它是由n(n≥0)个结点组成的具有有层次关系的有限集特点:当 n=0 时,称为空树,在任何一个非空树中:有且只有一个根结点当 n>1 时,其余结点可分为 m(m>0) 个互不相交的有限集T1,T2,…Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree),每棵子树的根节点有且只有一个前驱,可以有0个或多个后继如图所示:.树是递归定义的概念名称概念结点的度:一个节原创 2021-10-07 16:17:49 · 1247 阅读 · 23 评论 -
栈和队列相关面试题
前言:上篇文章介绍了栈和队列及其相关操作,本篇通过几个面试题,来进一步掌握栈和队列~目录括号匹配问题用队列实现栈用栈实现队列实现一个最小栈设计一个循环队列括号匹配问题题目:在线OJ用队列实现栈题目:在线OJ用栈实现队列题目:在线OJ实现一个最小栈题目:在线OJ设计一个循环队列题目: 在线OJ...原创 2021-10-03 14:51:29 · 890 阅读 · 43 评论 -
栈和队列 【数据结构】
前言: 栈和队列都是基于List(线性表)来实现的,且其限制比List更严格(提供的操作更少),即 List 比站栈和队列更灵活栈的实际应用场景非常多,队列的实际应用场景更多目录栈 (Stack)概念栈的实现队列 (Queue)概念队列的实现以链表为例 不带傀儡节点以数组为例循环队列(高效操作)栈和队列的方法栈 (Stack)概念栈是限定仅在末尾进行插入和删除操作的线性表,表尾指栈顶,而不是栈底栈限制了线性表的插入和删除位置,它始终在栈顶进行则:栈底是固定的,最先进栈的只能在栈底先进后出只支原创 2021-09-29 15:05:39 · 958 阅读 · 24 评论 -
扑克牌练习 【数据结构】
前言: 之前学了List常用的方法,下面就是用List来完成扑克牌练习~通过扑克牌这个练习,进一步来掌握 List 的一些用法!炸金花练习—目录思路代码实现:创建一张牌—Card类创建一副牌主类代码:输出示例:思路在我们动手写代码之前,我们需要思考扑克牌应该有什么?联想到我们平时玩扑克牌一张牌:有花色和点数两个属性,那么我们可以创建一个类Card,来表示一张牌一副牌:一张牌是一个 Card,那么一些牌放在一起就组成了一副牌,就可以创建一个 List< Card > ,返回结果是原创 2021-09-27 17:20:52 · 2010 阅读 · 30 评论 -
Java—List的使用【数据结构】
List - 线性表List 常用方法总览:List 接口继承于Collection接口List 特指:线性表这一类数据结构,而List的典型实现有:Vector,ArrayList 和 LinkedList三个其中 Vector 和 ArrayList 表示顺序表,而 LinkedList 表示链表List 常用方法...原创 2021-09-26 22:23:18 · 3535 阅读 · 20 评论 -
简单介绍-泛型和包装类【数据结构】
泛型什么是泛型?背景:为了能够写一个类 / 一个方法,就能够同时支持多种不同类型的对象所谓的泛型,就是从语法层面对 Object 进行了一个简单的包装,编译过程可以帮我们自动加上一些编译期的类型检查,自动帮我们完成一些类型转换工作举例:ArrayList 就是一个泛型的实例,可以聚集任何类型的对象使用 Object,因为在 Java 中,Object 是所有子类直接 / 间接继承的父类public class ArrayListTest { private Object[] data;原创 2021-09-25 22:19:27 · 632 阅读 · 12 评论 -
Map 接口常用操作【数据结构】
理解 Map 接口Map 中存储的是键值对(Key Value),通过Key 来找到相应的 Value其中 key 要求是不能重复的Map 常用操作:原创 2021-09-19 21:00:26 · 935 阅读 · 20 评论 -
Collection接口常用操作【数据结构】
Collection 接口概念:collection 即单列集合用来存储管理一组对象 objects,这些对象一般被称为元素 elements,统一定义了一套单列集合的接口Collection 常用操作:1.创建 Collection对象:import java.util.ArrayList;import java.util.Collection;public class TestCollection { public static void main(String[] args)原创 2021-09-19 14:49:43 · 1289 阅读 · 24 评论 -
Java—集合框架图
Java集合框架图关系: 接口与接口:extends; 类和接口:implements注意:Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elementsSet : 元素不能重复,背后隐含着查找 / 搜索的语义,若有重复,只算一个SortedSet : 一组有序的不能重复的元素List : 线性结构Queue : 队列Deque : 双端队列Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语原创 2021-09-15 11:32:28 · 1034 阅读 · 8 评论 -
Java实现双向链表的基本操作
Java实现无头双向链表双向链表节点的定义1.链表的打印2.头插法3.尾插法4.任意位置插入5.查找链表中是否包含关键字 key6.删除第一次出现关键字为 key 的节点8.链表长度介绍:双向链表比单链表多了一个 prev(前驱) 域,指向前一个节点data:数据next:后继信息prev:前驱信息.无头双向链表图解:双向链表节点的定义class Node{ public int data;//数据 public Node next;//后继信息 publ原创 2021-09-02 14:08:02 · 1083 阅读 · 31 评论 -
链表常见面试题( 建议收藏!!)
链表面试题????1.删除链表中等于给定值 val 的所有节点2.二级目录3.三级目录1.删除链表中等于给定值 val 的所有节点题目:题目链接: https://leetcode-cn.com/problems/remove-linked-list-elements/.思考:用tmp记录当前节点,若tmp 的下一个节点不为空且下一个节点的节点值等于给定的 val,则需要删除tmp的下一个节点2.二级目录3.三级目录...原创 2021-08-31 21:54:30 · 4211 阅读 · 41 评论 -
Java实现单链表
上篇博客我们实现了顺序表的所有操作,而顺序表存在以下问题:顺序表中间 / 头部的插入 / 删除,时间复杂度为O(N)扩容需要申请新空间,拷贝数据,释放旧空间,会有不小的损耗扩容一般是呈两倍的增长,势必会有一定的空间浪费,例如,当前容量为100,满了后扩容到200,再继续插入5个元素,后面没有元素插入,那么就浪费了95个数据空间为了避免上述的这些缺点,引入了链表,通过本篇博客的学习,我们要熟悉单链表的使用链表定义:链表是一种物理存储结构上非连续存储结构,是Java数据结构中一种很基础很常见原创 2021-08-24 18:52:08 · 686 阅读 · 21 评论 -
Java实现顺序表
提高代码量,理解面向对象思想线性表(List)定义:零个或多个具有相同特性的数据元素的有限序列常见的线性表有:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就是说是连续的一条直线,但在物理结构上不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储// An highlighted blockvar foo = 'bar';顺序表:顺序表是用一段物理地址连续的存储单元依次存储元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删改查,顺序表的底层.原创 2021-08-21 16:28:44 · 2082 阅读 · 13 评论 -
时间 / 空间复杂度
复杂度复杂度是衡量一个算法效率的,从两方面,时间方面和空间方面1.时间复杂度什么是时间复杂度?时间复杂度,也称为:时间效率;算法中的基本操作的执行次数,为算法的时间复杂度时间复杂度主要来衡量的是一个算法的运行速度算法的时间复杂度是一个函数,定量描述了该算法的运行时间。一个算法所花费的时间与其中的语句的执行次数成正比例大O渐进表示法:先看一个例子:public static void func(int n){ int count = 0; for (int i = 0; i原创 2021-08-19 22:10:50 · 340 阅读 · 15 评论