Leetcode|数据结构
图解算法数据结构 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 (leetcode-cn.com)
[TOC]
数组⁍
数组⁍
可变数组⁍
1 |
|
链表⁍
1 |
|
栈⁍
先入后出
注意:通常情况下,不推荐使用 Java 的 Vector 以及其子类 Stack ,而一般将 LinkedList 作为栈来使用。详细说明请见:Stack,ArrayDeque,LinkedList 的区别
1 |
|
(更常用)另一种写法:用Deque(都是从List第一个元素开始进行操作,和上面的是倒着的)
1 |
|
队列⁍
先入先出
1 |
|
树⁍
树是一种非线性数据结构,根据子节点数量可分为 「二叉树」 和 「多叉树」
1 |
|
建立此二叉树需要实例化每个节点,并构建各节点的引用指向。
1 |
|
图⁍
图是一种非线性数据结构,由「节点(顶点)vertex」和「边 edge」组成,每条边连接一对顶点。根据边的方向有无,图可分为「有向图」和「无向图」。
无向图⁍
-
邻接矩阵
$edges[i][j]$ 代表节点 $i+1$ 和 节点 $j+1$ 之间是否有边。
1
2
3
4
5
6
7int[] vertices = {1, 2, 3, 4, 5};
int[][] edges = {{0, 1, 1, 1, 1},
{1, 0, 0, 1, 0},
{1, 0, 0, 0, 1},
{1, 1, 0, 0, 1},
{1, 0, 1, 1, 0}}; -
邻接表
$edges$ 为一个二维容器,第一维 $i$ 代表顶点索引,第二维 $edges[i]$ 存储此顶点对应的边集和;例如$edges[0] = [1, 2, 3, 4]$代表 $vertices[0]$ 的边集合为$[1, 2, 3, 4]$ 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14int[] vertices = {1, 2, 3, 4, 5};
List<List<Integer>> edges = new ArrayList<>();
List<Integer> edge_1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
List<Integer> edge_2 = new ArrayList<>(Arrays.asList(0, 3));
List<Integer> edge_3 = new ArrayList<>(Arrays.asList(0, 4));
List<Integer> edge_4 = new ArrayList<>(Arrays.asList(0, 1, 4));
List<Integer> edge_5 = new ArrayList<>(Arrays.asList(0, 2, 3));
edges.add(edge_1);
edges.add(edge_2);
edges.add(edge_3);
edges.add(edge_4);
edges.add(edge_5);
邻接矩阵 VS 邻接表 :
邻接矩阵的大小只与节点数量有关,即 $N^2$,其中 $N$ 为节点数量。因此,当边数量明显少于节点数量时,使用邻接矩阵存储图会造成较大的内存浪费。因此, 邻接矩阵 适合存储稠密图(顶点较少、边较多);邻接表 适合存储稀疏图(顶点较多、边较少)。
散列表⁍
非线性数据结构,通过利用 Hash 函数将指定的「键 key
」映射至对应的「值 value
」,
1 |
|
堆⁍
堆是一种基于「完全二叉树」的数据结构,可使用数组实现。
以堆为原理的排序算法称为「堆排序」,基于堆实现的数据结构为「优先队列」。
堆分为「大顶堆」和「小顶堆」,
大顶堆就是根节点最大小顶堆就是根节点最小
完全二叉树定义: 设二叉树深度为 $k$
- 除第 $k$ 层外的其它各层(第 $1$ 至 $k-1$ 层)的节点达到最大个数
- 处于第 $k$ 层的节点都连续集中在最左边,
则称此二叉树为完全二叉树。
通过使用「优先队列」的「压入 push()
」和「弹出 pop()
」操作,即可完成堆排序
1 |
|
大顶堆的实现
-
自定义排序
1
2Queue<Integer> heap = new PriorityQueue<>((o1, o2) -> o2 - o1);
-
小顶堆取负