
数据结构
dan_zhoudan
研究生阶段
展开
-
区间分组 -- 活动安排问题
一.题目给定 N 个闭区间 [ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。输出最小组数。输入格式第一行包含整数 N,表示区间数。接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表示最小组数。数据范围1≤N≤105,−109≤ai≤bi≤109输入样例:3-1 12 43 5输出样例:2解答思路1将结点按照左端点排序,然后使用优先队列(小根堆)Priority原创 2021-10-27 15:38:53 · 506 阅读 · 0 评论 -
前缀和与差分
差分 思想:通过原始数组a,构造差分数组b。由下面两个函数构成://差分数组的插入函数public void insert(int l,int r,int c) { b[l] += c; b[r+1] -= c;}//a数组for(int i = 1;i <= n;i ++) { a[i] = sc.nextInt();}//构造差分数组bfor(int i = 1;i <= n;i ++) { insert(i, i, ...原创 2021-06-04 11:53:40 · 212 阅读 · 0 评论 -
搜索与图论算法的模板化思路
queue <- 队头元素 (入队)while(queue.size() > 0) { t <- 队头 (出队) //扩展t的所有邻点 x for(int x = h[t]; x != -1; x = ne[x]) { int j = e[x]; if(!st[j]) { queue <- j; //j入队 }...原创 2020-08-22 10:56:09 · 176 阅读 · 0 评论 -
JDK8中ConcurrentHashMap源码解析
线程安全1.8中没有了Segment对象1. put()1.8中 ,concurrentHashMap只有一个Node[]数组:putVal():首先计算hash值,然后根据这个 hash & (n - 1),算出下标 iUnsafe():通过Unsafa()方法从数组中获取第i个元素的值。CAS自旋:new Node<K,V>(),通过cas的操作,将新的Node结点放到数组的第i个位置。如果cas成功,则 break。若CAS失败..原创 2020-08-22 10:29:56 · 271 阅读 · 0 评论 -
1.8 HashMap源码
1、红黑树《算法导论》中对于红黑树的定义:每个节点或是红的,或是黑的 根节点是黑的 每个叶节点是黑色(叶节点用Null来表示 Show Null Leaves) 如果一个结点是红色,则它的两个儿子都是黑色(不能出现连续的红节点) 对每个结点,从该节点到其子孙结点的所有路径上包含相同数目的黑节点(黑节点平衡)NULL结点插入新节点:默认是红色 变色操作 例如:依次插入10、20、30会进行 变色 + 左旋红黑树新插入结点p:p的父节点是黑色,则不用进行调整;p.原创 2020-08-19 13:51:39 · 160 阅读 · 0 评论 -
ConcurrentHashMap JDK1.7
1. ConcurrentHashmap2. HashEntry3.原创 2020-08-18 19:36:47 · 247 阅读 · 0 评论 -
反转链表
1、题目描述定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思考题:请同时实现迭代版本和递归版本。样例输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL2、分析(1)使用栈栈是一个特殊的数据结构,特点是先进后出(First In Last Out 简称FILO),这种特殊的数据结构,可以用在对链表做反转中,或者字符串逆序,因为要把头变成尾,尾变成头原创 2020-07-17 13:30:57 · 119 阅读 · 0 评论 -
搜索与图论 - Dijkstra求最短路I
1、题目描述给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出-1。数据范围1≤n≤5001≤n≤500,1≤m≤1051≤m≤105,图中涉及边长均不超过10000。输入样例:原创 2020-06-26 20:14:58 · 339 阅读 · 0 评论 -
搜索与图论 - 有向图的拓扑序列
1、题目描述给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。输入格式第一行包含两个整数n和m接下来m行,每行包含两个整数x和y,表示存在一条从点x到点y的有向边(x, y)。输出格式共一行,如果存在拓扑序列,则输出拓扑序列。否则输出-1。数据范围1≤n,m≤原创 2020-06-26 13:57:19 · 1182 阅读 · 0 评论 -
搜索与图论 - 图中点的层次
1、题目描述给定一个n个点m条边的有向图,图中可能存在重边和自环。所有边的长度都是1,点的编号为1~n。请你求出1号点到n号点的最短距离,如果从1号点无法走到n号点,输出-1。输入格式第一行包含两个整数n和m。接下来m行,每行包含两个整数a和b,表示存在一条从a走到b的长度为1的边。输出格式输出一个整数,表示1号点到n号点的最短距离。数据范围1≤n,m≤1051≤n,m≤105输入样例:4 51 22 33 41 31 4输出样例:1原创 2020-06-26 10:48:45 · 717 阅读 · 0 评论 -
搜索与图论 - 树的重心
1、题目描述给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数n,表示树的结点数。接下来n-1行,每行包含两个整数a和b,表示点a和点b之间存在一条边。输出格式输出一个整数m,表示重心的所有的子树中最大的子树的结点数目。数据范围1≤n≤1051≤n≤10原创 2020-06-25 22:33:31 · 389 阅读 · 0 评论 -
数据结构 - 模拟哈希表
1、题目描述维护一个集合,支持如下几种操作:“I x”,插入一个数x; “Q x”,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数N,表示操作数量。接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。输出格式对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”。每个结果占一行。数据范围1≤N≤1051≤N≤105−109≤x≤109原创 2020-06-23 15:16:40 · 287 阅读 · 0 评论 -
数据结构 - 堆排序
1、题目描述输入一个长度为n的整数数列,从小到大输出前m小的数。输入格式第一行包含整数n和m。第二行包含n个整数,表示整数数列。输出格式共一行,包含m个整数,表示整数数列中前m小的数。数据范围1≤m≤n≤1051≤m≤n≤105,1≤数列中元素≤1091≤数列中元素≤109输入样例:5 34 5 1 3 2输出样例:1 2 32、 分析以小根堆为例,建堆:/** * 建小顶堆:从最后一个非叶子...原创 2020-06-23 09:00:03 · 618 阅读 · 0 评论 -
数据结构 - 模拟队列
1、题目描述实现一个队列,队列初始为空,支持四种操作:(1) “push x” – 向队尾插入一个数x;(2) “pop” – 从队头弹出一个数;(3) “empty” – 判断队列是否为空;(4) “query” – 查询队头元素。现在要对队列进行M个操作,其中的每个操作3和操作4都要输出相应的结果。输入格式第一行包含整数M,表示操作次数。接下来M行,每行包含一个操作命令,操作命令为”push x”,”pop”,”empty”,”query”中的一种。输出格式原创 2020-06-22 15:13:44 · 562 阅读 · 0 评论 -
数据结构 - Trie模板
1、题目描述维护一个字符串集合,支持两种操作:“I x”向集合中插入一个字符串x; “Q x”询问一个字符串在集合中出现了多少次。共有N个操作,输入的字符串总长度不超过105105,字符串仅包含小写英文字母。输入格式第一行包含整数N,表示操作数。接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。输出格式对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。每个结果占一行。数据范围1≤N≤2∗1041≤N≤2∗10.原创 2020-06-22 09:52:53 · 238 阅读 · 0 评论 -
数据结构 - 单调队列
1、题目描述滑动窗口给定一个大小为n≤106n≤106的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。您只能在窗口中看到k个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为[1 3 -1 -3 5 3 6 7],k为3。窗口位置 最小值 最大值 [1 3 -1] -3 5 3 6 7 -1 3 1 [3 -1 -3] 5 3 6 7 -3 3 1 3 [-1 -3 5] 3 6 7 -3原创 2020-06-21 16:16:22 · 263 阅读 · 0 评论 -
数据结构 -- 单调栈
1、题目描述给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。输入格式第一行包含整数N,表示数列长度。第二行包含N个整数,表示整数数列。输出格式共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。数据范围1≤N≤1051≤N≤1051≤数列中元素≤1091≤数列中元素≤109输入样例:53 4 2 7 5输出样例:-1 3 -1 2 22、分析(1)栈的数据结构.原创 2020-06-21 12:01:18 · 298 阅读 · 0 评论 -
食物链 -- 《算法竞赛进阶指南》 , NOI2001 超详细解析
1、题目描述动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是”1 X Y”,表示X和Y是同类。第二种说法是”2 X Y”,表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则原创 2020-06-14 22:52:21 · 832 阅读 · 0 评论 -
并查集 -- 合并集合
1、题目描述https://www.acwing.com/problem/content/838/一共有n个数,编号是1~n,最开始每个数各自在一个集合中。现在要进行m个操作,操作共有两种:“M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作; “Q a b”,询问编号为a和b的两个数是否在同一个集合中;输入格式第一行输入整数n和m。接下来m行,每行包含一个操作指令,指令为“M a b”或“Q a b”中的一种。输出格式对.原创 2020-06-13 10:03:03 · 535 阅读 · 0 评论 -
Map接口 -- HashMap底层原理
1、源码2、图例表示3、存储过程4、取数据4、测试hash算法5、LeetCode 706设计哈希映射class MyHashMap { class Node{ private int key; private int val; private Node next; public Node(int key,int val){ this.key = key; this.val = val; ...原创 2020-06-08 14:05:46 · 182 阅读 · 0 评论