
数据结构与算法学习(C++)
数据结构与算法
我家瓜皮z47
本人是计算机专业学生,主要研究人工智能、计算机视觉方向
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数据结构一些算法总结
DFS和BFS的理解原创 2020-07-01 14:28:55 · 152 阅读 · 0 评论 -
树和图的优先深度遍历_day_25
846、树的重心给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数n,表示树的结点数。接下来n-1行,每行包含两个整数a和b,表示点a和点b之间存在一条边。输出格式输出一个整数m,表示重心的所有的子树中最大的子树的结点数目。数据范围1<=n<=1051 <=原创 2020-06-15 22:14:34 · 116 阅读 · 0 评论 -
搜索与图论——BFS(2)_day_24
题目在一个3×3的网格中,1~8这8个数字和一个“x”恰好不重不漏地分布在这3×3的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把“x”与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让“x”先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 1 2 3 1 2 3 1 2 3x 4 6 4 x 6原创 2020-06-14 13:02:36 · 118 阅读 · 0 评论 -
搜索和图论——BFS(1)—day—23
宽度优先搜索方法(边权都是1的时候)1、把所有距离为1的点全都搜到2、把所有距离为2的点全都搜到3、把所有距离为3的点全都搜到具体问题:844、走迷宫给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条原创 2020-06-01 21:55:18 · 131 阅读 · 0 评论 -
搜索和图论——DFS(2)—day—22
n皇后问题问题描述n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数n。输出格式每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。其中”.”表示某一个位置的方格状态为空,”Q”表示某一个位置的方格...原创 2020-05-07 21:52:14 · 149 阅读 · 0 评论 -
搜索和图论——DFS—day—22
DFS—暴力搜索1、按照怎样的顺序搜索842、排列数字问题给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1<=n<=71 <= n <= 71<=n<=7输入样例3输出样例1 2 3...原创 2020-05-07 21:15:32 · 150 阅读 · 0 评论 -
区间合并——day—11
区间合并问题给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3]和[2,6]可以合并为一个区间[1,6]。输入格式第一行包含整数n。接下来n行,每行包含两个整数 l 和 r。输出格式共一行,包含一个整数,表示合并区间完成后的区间个数。数据范围1≤n≤100000 ,−1000000000≤...原创 2020-04-05 13:22:44 · 141 阅读 · 0 评论 -
离散化——day—11
区间和离散化模板vector<int> alls;//存储所有待离散化的值sort(alls.begin(), alls.end());//将所有值排序alls.erase(unique(alls.begin, alls.end()), alls.end());//去掉重复元素//二分求出x对应的离散化的值int find(int x) //找到第一个大于等于x的位置 ...原创 2020-04-05 12:32:19 · 178 阅读 · 0 评论 -
位运算——day—10
解析:lowbit(x):返回 x 的 最后一位1;x & -x = x & (~x + 1);// ~x:x的取反;x = 1010…100000~x = 0101…011111~x + 1 = 0101…100000x & (~ x + 1) = 0000…100000问题二进制中1的个数:给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个...原创 2020-04-03 10:57:23 · 90 阅读 · 0 评论 -
双指针算法——day—10
问题数组元素的目标和给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。请你求出满足A[i] + B[j] = x的数对(i, j)。数据保证有唯一解。输入格式第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。第二行包含n个整数,表示数组A。第三行包含m个整数,表示数组B。输出格式共一行,包含两个整数 i 和 j 。数据范围第一行包含三...原创 2020-04-03 10:04:05 · 143 阅读 · 0 评论 -
双指针算法——day—9
//朴素做法模板for (int i = 0; i < n; i ++) for (int j = 0; j <= i; j ++) if check(j, i) { res = max(res, i - j + 1) }//双指针算法模板for (int i = 0, j = 0; i < n; i++){ while (j <= i &a...原创 2020-03-04 10:01:57 · 183 阅读 · 0 评论 -
前缀和差分——day—8
Example_2问题差分矩阵输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数x1, y1, x2, y2, c,其中(x1, y1)和(x2, y2)表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上c。请你将进行完所有操作后的矩阵输出。输入格式第一行包含整数n,m,q。接下来n行,每行包含m个整数,表示整数矩阵。接下来q行,...原创 2020-02-27 12:08:54 · 167 阅读 · 0 评论 -
前缀和差分——day—8
差分Method构造差分数组使得b数组是a数组的差分在b数组上操作,还原于a数组问题输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数序列。接下来m行,每行包含三个整数l,r,c,表示一个操作。输出...原创 2020-02-27 11:10:31 · 99 阅读 · 0 评论 -
前缀和与差分——day—7
子矩阵的和Methods[i,j]如何计算(x1, y1), (x2, y2)这一矩阵中的所有数的和如何计算s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1])问题输入一个n行m列的...原创 2020-02-26 10:40:18 · 191 阅读 · 0 评论 -
前缀和与差分——day—7
前缀和Method前缀和:Si = a1 + a2 + … + ai;如何求Si;Si的作用。问题输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。输出格式共m行...原创 2020-02-26 10:08:16 · 188 阅读 · 0 评论 -
高精度运算——day—6
高精度乘法Example——3问题给定两个正整数A和B,请你计算A * B的值。输入格式共两行,第一行包含整数A,第二行包含整数B。输出格式共一行,包含A * B的值。数据范围1≤A的长度≤100000 ,1≤B≤10000输入样例5823输出样例1334完整代码实现//高精度运算_C++_day_6_2.25//高进度乘法#include<ios...原创 2020-02-25 11:05:57 · 226 阅读 · 0 评论 -
高精度运算——day—5
高精度减法Example—2问题给定两个正整数,计算它们的差,计算结果可能为负数。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的差。数据范围1≤整数长度≤100000输入样例5612输出样例44完整代码实现//高精度运算_C++_day_5_2.21//高进度加法//1.大整数的数组存储//2.大整数数组的减法#include<io...原创 2020-02-21 12:32:17 · 161 阅读 · 0 评论 -
高精度运算——day—5
高精度加法Method大整数存储——数组存储高-——低存储;大整数数组运算Example—1问题给定两个正整数,计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1≤整数长度≤100000输入样例123567输出样例690完整代码实现//高精度运算_C++_day_5_2.21//高进度加法//1.大整数的数组存...原创 2020-02-21 11:43:18 · 109 阅读 · 0 评论 -
二分法——day—4
Example2_数的三次方根问题给定一个浮点数n,求它的三次方根。——浮点数的三次方根输入格式共一行,包含一个浮点数n。输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留6位小数。数据范围−10000≤n≤10000输入样例1000输出样例10.000000完整代码实现//二分法_C++_day_4_2.20//浮点数的二分//数的三次方根#i...原创 2020-02-20 10:30:05 · 111 阅读 · 0 评论 -
二分法——day—3
Method待写待写…常用代码模板//代码模板//区间[l, r]被划分成[1, mid]和[mid + 1, r]使用int bsraech_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; else l = mid + 1; }...原创 2020-02-19 12:06:58 · 120 阅读 · 0 评论 -
快速排序——分治—day—1
Method确定分界点x: q[l], q[r] 或者 q[(l+r)/2] 或者 任意数调整区间范围 :左端所有数 < = x; 右端所有数 >= x;(重点部分)递归排序。Example1问题:给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个...原创 2020-02-17 10:26:02 · 155 阅读 · 0 评论 -
快速排序——day—2
Example-2__第k个数问题给定一个长度为n的整数数列,以及一个整数k。请用快速选择算法求出数列的第k小的数是多少。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在1~1000000范围内),表示整数数列。输出格式输出一个整数,表示数列的第k小数。数据范围1 <= n <= 1000000,1 <= k <= n输入...原创 2020-02-18 09:37:08 · 162 阅读 · 0 评论 -
归并排序——day—2
Method确定分界点 中点 :q[(l+r)/2];递归排序归并——合二为一(重点)Example问题给定你一个长度为n的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~1000000范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表...原创 2020-02-18 11:02:20 · 155 阅读 · 0 评论 -
归并排序——day—3
Example-2_逆序数对问题给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。输入格式第一行包含整数n,表示数列的长度。第二行包含 n 个整数,表示整个数列。输出格式输出一个整数,表示逆序对的个数。数据范围1≤n≤1000...原创 2020-02-19 10:12:41 · 112 阅读 · 0 评论 -
数据结构——day—12
单链表邻接表:存储图和树。双链表:优化某些问题。实现一个单链表,链表初始为空,支持三种操作:(1) 向链表头插入一个数;(2) 删除第k个插入的数后面的数;(3) 在第k个插入的数后插入一个数现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:...原创 2020-04-16 11:17:35 · 102 阅读 · 0 评论 -
数据结构——day—12
双链表问题实现一个双链表,双链表初始为空,支持5种操作:(1) 在最左侧插入一个数;(2) 在最右侧插入一个数;(3) 将第k个插入的数删除;(4) 在第k个插入的数左侧插入一个数;(5) 在第k个插入的数右侧插入一个数现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插...原创 2020-04-16 15:42:51 · 104 阅读 · 0 评论 -
数据结构——day—13
栈——先进后出队列——先进先出用数组来模拟栈数组模拟栈的一般形式//数组模拟栈#include<iostream>using namespace std;const int N = 100010;int stk[N], tt;//插入stk[++ tt] = x;//弹出tt--;//判断栈是否为空if (tt > 0) not emp...原创 2020-04-21 22:49:09 · 102 阅读 · 0 评论 -
数据结构——day—13
队列数组模拟队列一般操作#include<iostream>using namespace std;const int N = 100010;//在队尾插入元素,在队头弹出元素int q[N], hh, tt = -1;//插入q[++tt] = x;//弹出hh++;//判断队列是否为空if (hh <= tt) not emptyels...原创 2020-04-22 22:42:08 · 120 阅读 · 0 评论 -
数据结构——day—14
单调栈单调栈的实现问题给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。输入格式第一行包含整数N,表示数列长度。第二行包含N个整数,表示整数数列。输出格式共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。数据范围1≤N≤1000001≤数列中元素≤100000000样例输入53 4 2 7 5...原创 2020-04-24 21:29:54 · 108 阅读 · 0 评论 -
数据结构——day—14
单调队列经典问题给定一个大小为n≤106的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。您只能在窗口中看到k个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为[1 3 -1 -3 5 3 6 7],k为3。窗口位置最大值最小值[1 3 -1] -3 5 3 6 7-131 [3 -1 -3] 5 3 6 7-33...原创 2020-04-24 23:13:26 · 128 阅读 · 0 评论 -
数据结构——day—15
KMP算法——字符串匹配算法暴力枚举——时间复杂度太高for (int i = 0; i < n; i++) { bool flag = true; for (int j = 0; j < m; j++) if (s[i + j] != p[j]) { flag = false; break; }问题给定一个模式串S,以及一个模板串...原创 2020-04-27 21:55:13 · 109 阅读 · 0 评论 -
数据结构——day—16
trie树:高效地存储和查找字符串集合的数据结构问题维护一个字符串集合,支持两种操作:1.“l x”向集合中插入一个字符串x;2.“Q x”询问一个字符串在集合中出现了多少次。共有N个操作,输入的字符串总长度不超过10510^5105,字符串仅包含小写英文字母。输入格式第一行包含整数N,表示操作数。接下来N行,每行包含一个操作指令,指令为“l x”或“Q x”中的一种。输出格式...原创 2020-04-28 14:14:01 · 106 阅读 · 0 评论 -
数据结构——day—16
最大异或对问题在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?输入格式第一行输入一个整数N。第二行输入N个整数A1~AN输出格式输出一个整数表示答案数据范围1<=N<=1051 <= N <= 10^51<=N<=1051<=Ai<=2311 <= Ai <= 2^{31}1&...原创 2020-04-28 21:52:44 · 200 阅读 · 0 评论 -
数据结构——day—17
并查集:1.将两个集合合并2.询问两个元素是否在一个集合当中。belong[x] = aif (belongp[x] == belong[y]) 近乎O(1)基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点。问题1:如何判断树根:if (p[x] == x)问题2:如何求x的集合编号:while (p[x] != x...原创 2020-04-29 17:42:36 · 109 阅读 · 0 评论 -
数据结构——day—18
并查集问题:连通块中点的数量给定一个包含n个点(编号为1~n)的无向图,初始时图中没有边。现在要进行m个操作,操作共有三种:1.“C a b”,在点a和点b之间连一条边,a和b可能相等;2.“Q1 a b”,询问点a和点b是否在同一个连通块中,a和b可能相等;3.“Q2 a”,询问点a所在连通块中点的数量;输入格式第一行输入整数n和m。接下来m行,每行包含一个操作指令,指令为“C...原创 2020-04-30 08:55:22 · 126 阅读 · 0 评论 -
数据结构——day—19
并查集03问题:食物链描述动物王国中有三类动物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个动物,用上述两种说...原创 2020-04-30 17:58:53 · 100 阅读 · 0 评论 -
数据结构——day—20
堆——维护一个数据集合如何手写一个堆?1、插入一个数 ———— hep[ ++ size] = x; up(size);2、求集合当中的最小值、———— heap[1];3、删除最小值 ———— heap[1] = heap[size]; size --; down(1);4、删除任意一个元素———— heap[k] = heap[size]; size --; down(k);...原创 2020-05-01 13:36:10 · 146 阅读 · 0 评论 -
数据结构——day—20
模拟堆问题描述:维护一个集合,初始时集合为空,支持如下几种操作:1、“I x”,插入一个数x;2、“PM”,输出当前集合中的最小值;3、“DM”,删除当前集合中的最小值(数据保证此时的最小值唯一);4、“D k”,删除第k个插入的数;5、“C k x”,修改第k个插入的数,将其变为x;现在要进行N次操作,对于所有第2个操作,输出当前集合的最小值。输入格式第一行包含整数N。接下...原创 2020-05-03 13:34:59 · 125 阅读 · 0 评论 -
数据结构——day—21
哈希表:1、存储结构:开放寻址法和拉链法2、字符串哈希方法拉链法1、开一个·一维数组存储所有的哈希值‘;2、处理冲突:每次映射到一个数x时,在x下拉一条链,用来储存这个槽上的所有数。哈希算法是期望算法。一般是O(1);算法题中一般只有添加、查找操作。如果要实现删除,不会真正删除,一般会打个标记,代表它已经删除了。问题描述维护一个集合,支持如下几种操作:“I x”,插入一个数x...原创 2020-05-03 20:03:07 · 124 阅读 · 0 评论 -
数据结构——day—21
哈希表字符串哈希——字符串前缀和哈希法——处理字符串的利器1、不能把字母映射成0;2、哈希字符串的时候,假定不存在冲突:p=131或者13331;Q=264p = 131或者13331;Q = 2^{64}p=131或者13331;Q=264问题描述给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1]和[l2,r2]这两个区间所包...原创 2020-05-04 00:06:30 · 108 阅读 · 0 评论