Java_数据结构
笔记
琉清霜
快 乐 肥宅!!!
展开
-
广度优先搜索 Breadth First Search
一石激起千层浪广度优先搜索模型: bfs( ) { 1.建立起开始步骤,队列初始化 2.遍历队列中的每一种可能,while(队列不为空) { 通过队头元素带出下一步所有的可能,并且依次入队 { 判断当前情况是否达成目标:按照目标要求处理逻辑 } 继续遍历队列中的剩余情况 }}例题1:员工的重要性import ja原创 2021-04-22 15:06:05 · 103 阅读 · 1 评论 -
深度优先搜索 DepthFirst Search
1. dfs:1 深度优先搜索的关键是解决 -> 目前需要如何做 ,下一步的做法和当前的做法是相同的2 目前需要如何做 -> 一般是尝试每一种可能,遍历循环,对于每一种可能确定之后,继续走下一步,当前的剩余可能等到从下一步回退之后再处理,(深度优先搜索的模型) Dfs (当前这一步的处理逻辑) { 1.判断边界,是否已经一条路走到黑 :向上回退 2.尝试当下的每一种可能 3.确定一种可能后,继续下一步Dfs(下一步) }例题1:员工的重要性原创 2021-04-17 15:58:13 · 195 阅读 · 3 评论 -
Dynamic Programming 动态规划
**思想:**分治思想的延伸,将大问题化解为小问题的分治过程。在处理的过程中,保存这些小问题的处理结果,在后面处理大问题时,可以直接调用**例题1 :输出斐波那契数列的第n项我们通过推导已知 斐波那契数列的规律 f(n) = f(n-1) + f(n-2) f(0) = 0 f(1) = 1动态规划分析:状态转移方程 dp[i+1] = dp[i] + dp[i-1]class Solution { public int fib(int n) { if(n==0){原创 2021-04-14 11:03:16 · 101 阅读 · 1 评论 -
692. 前K个高频单词
思路:先统计各个单词的出现次数将所有单词 + 次数组织成线性结构使用优先队列public class Solution2 { static class WordCount implements Comparable<WordCount> { String word; int count; public WordCount(String word, int count) { this.word = wo.原创 2021-04-12 20:29:47 · 127 阅读 · 0 评论 -
138. 复制带随机指针的链表
思路1: 复制链表 和 处理random 分开进行 使用Map1.首先复制链表(遍历+尾插)2.使用Map保存映射关系<旧结点 -> 新结点 > + oldRandom 得到 newRandomimport java.util.Comparator;import java.util.Map;import java.util.TreeMap;public class Solution { static class NodeComparator implements ..原创 2021-04-12 17:49:49 · 76 阅读 · 0 评论 -
哈希表 + HashSet + HashMap
概念:哈希冲突::对于两个数据元素的关键字kik_iki和 kjk_jkj(i != j),有kik_iki != kjk_jkj,但有:Hash(kik_iki) == Hash(kjk_jkj),即:不同关键字通过相同哈希哈数计算出相同的哈希地址,该种现象称为哈希冲突或哈希碰撞。我们通常准备的哈希表是通用对的,所以往往是无法避免的。同时冲突率和空间浪费相互对应。负载因子调节:散列表的负载因子定义为: 填入表中的元素 / 散列表的长度(数组的长度)Java库限制负载因子的原创 2021-04-12 11:23:06 · 172 阅读 · 0 评论 -
Map 和 Set
一种用来搜索的数据结构(容器)其搜索的效率与查找的方式有关1.遍历 O(N)2.二分查找为O(log2N)O(log_2N)O(log2N)Set: Set:一种不允许出现重复元素的集合,是否重复需要用.equals进行判断,同时Set不是线性结构TreeSet: 实现类 -> 搜索树(Balance BST 红黑树)两者的区别 : balance bstTreeSet和Set相比,要求元素类型具备比较的能力(Comparable 和 Comparator )ite原创 2021-04-09 19:33:32 · 115 阅读 · 0 评论 -
二叉搜索树 (Binary Search Tree) BST
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若左子树!=null,则左子树上所有节点的值均 < 根节点的值若右子树!=null,则右子树上所有节点的值均 > 根节点的值查找:...原创 2021-04-09 14:27:21 · 221 阅读 · 1 评论 -
排序算法3(归并)
整体思路:区间内的元素的个数 <=1 , 本次排序结束找到待排序区间的中间位置,把整个区间分为两段分别对左右两个小区间按照相同的方式排序 (归并排序)利用一段额外空间,对两个有序数组进行归并过程import java.util.Arrays;public class MergeSort { /* 不区分最好/平均/最坏情况 时间复杂度: O(n * log(n)) 空间复杂度: O(n) 具备稳定性:具备稳定性 */ pu原创 2021-04-09 09:06:50 · 79 阅读 · 1 评论 -
排序算法2(快排)
import java.util.Arrays;public class QuickSort { public static void quickSort(long[] array) { quickSortRange(array, 0, array.length - 1); } private static void quickSortRange(long[] array, int from, int to) { int size...原创 2021-04-06 10:05:12 · 80 阅读 · 0 评论 -
排序算法1(冒泡 / 选择 / 插入 / 希尔)
排序:Sort1.从小到大(非递减)2.排序一般只能应用在线性结构上(虽然链表也可以排序,但是如果没有特别说明,则默认为数组)冒泡排位 Bubble Sort 选择排序 Select Sort 插入排序 Insert Sort**整体思路:将无序区间不断缩小,到整个区间有序。**3使用 9 5 2 7 3 进行三种排位的模拟public class Sort { /* 情况分为最好/平均/最坏 最好:有序原创 2021-04-05 18:31:49 · 113 阅读 · 1 评论 -
Heap(堆)
Heap(堆) - 二叉树1.逻辑上是完全二叉树2.以顺序表的形式出现 (数组)3.大堆 / 小堆 (根节点的元素>=左右子树的元素 / 根节点的元素<=左右子树的元素 )堆的基本作用:在一组元素中,快速定位"最值"下标关系:parentIndex // 双亲节点 leftIndex = 2*parentIndex +1 ; //左子树关系 rightIndex = 2*parentIndex +1 ; // 右子树 childI原创 2021-04-02 11:59:38 · 92 阅读 · 0 评论 -
P105.根据一棵树的前序遍历与中序遍历构造二叉树/根据一棵树的中序遍历与后序遍历构造二叉树
思路:首先可以根据前序遍历和后序遍历的特点找到根节点通过中序遍历找到左子树的长度,即可推导出右子树的长度分别构建左右子树public class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder.length == 0) { return null; } int rootValue = preorder原创 2021-03-30 08:46:00 · 147 阅读 · 0 评论 -
p236.找到二叉树中两个结点的最近公共祖先
思路 :假如一个结点为根结点,则两个结点的最近公共祖先为根结点看 q. p 结点在 树的 左子树中还是右子树如果 两个结点 一个位于左子树 另一个位于 右子树 则 其最近的公共祖先 为 根节点分别在左右子树中递归查找原创 2021-03-29 22:40:43 · 373 阅读 · 0 评论 -
p102. 二叉树的层序遍历
思路1 :bfs 广度优先遍历 , 将每一层的结点放入一个List中, 然后再将这个list插入最终的List中 public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> list = new ArrayList<>(); if (root==null){ return list;原创 2021-03-29 22:03:59 · 79 阅读 · 0 评论 -
二叉树
1.一种非线性的数据结构2.每个结点中最多有左右两个子树,并且左右子树是有序树满二叉树 or 完全二叉树满二叉树 :即每一层的结点均为最大值,层数为K,则结点总数是2k−12^k-12k−1完全二叉树: 效率高二叉树的存储结构分为:顺序存储和类似于链表的链式存储。前序遍历 : 递归/非递归import java.util.ArrayList;import java.util.List;public class Solution1 { //递归 public List&l原创 2021-03-29 14:23:18 · 80 阅读 · 4 评论 -
栈和队列(Stack and Queue)
1.栈(Stack)1.1 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据在栈顶。1.2 实现1.1.1 利用顺序表 ,即使用尾插+尾删的2. 队列(Queue)2.1 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具原创 2021-03-25 08:59:49 · 313 阅读 · 0 评论 -
LinkedList
java.util.LinkedListListNode : 节点LinkedList : 链表1.类的作用2.类的继承关系3.常见方法的使用4 实现自己的MyLinkedList实现Node :package my_linked_list;public class Node { public String val; public Node prev ; public Node next ; public Node(String val, No原创 2021-03-19 08:41:54 · 81 阅读 · 0 评论 -
链表(LinkedList)
1.链表的原理属于一种线性表1.元素和元素直接有相对顺序的2.有头部/尾部3.prev / cur / next不同于顺序表:逻辑上存在线性结构,但不保证物理满足该次序原创 2021-03-08 23:11:09 · 85 阅读 · 0 评论 -
实现简单版本的顺序表
通过数组进行模拟属性表的属性:1.用来保存元素的空间 Integer[] array ;2.当前已有的元素个数 int size ;public interface MyList { boolean add(Integer e); void add(int index, Integer e); Integer remove(int index); boolean remove(Integer e); Integer get(int index);原创 2021-03-08 16:07:19 · 83 阅读 · 0 评论 -
扑克牌游戏
import java.util.Objects;public class Card { private final int rank; private final String suit; public Card(int rank, String suit) { this.rank = rank; this.suit = suit; } // [♥ A] ... @Override public Strin..原创 2021-03-04 21:17:25 · 159 阅读 · 2 评论 -
List
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。线性表:1.顺序表(逻辑上线性,在内存中存储时,也是严格按照逻辑上的次序保存起来的)2.链表(逻辑上线性,在内存中存储时,不保证连续性)Java中已经提出的顺序表 - 类: java.util.Ar原创 2021-03-04 21:12:23 · 215 阅读 · 2 评论 -
概述+时间复杂度空间复杂度
**数据结构(Data Structure)**是一门研究数据的组织和管理的学科。往往从外在表现为一组数据的集合或者容器。概念解释:元素(Element):被管理的原子数据,元素类型不限。集合(Collection):存放元素的容器,需要利用一定的数据结构知识对元素进行组织。遍历(Traversal)/ 迭代(Iterate): 在数据结构的语境下,往往表示对一个集合中的所有元素都按照一定的顺序处理一次。数据结构/算法的评价体系 —— 复杂度计算运行时间评估 —— 时间复杂度耗费空间评估 —原创 2021-03-03 10:35:05 · 91 阅读 · 0 评论