自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 邻接表实现哈希表(拉链法)

哈希表(拉链法)两种方法都主要解决可能出现不同的数映射到同一个数造成的冲突!题目来源于840. 模拟散列表 - AcWing题库题意:维护一个集合,支持如下几种操作:I x,插入一个数 x;Q x,询问数 x 是否在集合中出现过;现在要进行 N 次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数 N,表示操作数量。接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。输出格式对于每个询问指令 Q x,输出一个询问结果,如果 xx 在集合中出现过,

2022-04-04 21:05:41 366

原创 石子合并(区间DP)

石子合并(区间DP)题目来源于:282. 石子合并 - AcWing题库设有 N 堆石子排成一排,其编号为 1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有 4 堆石子分别为 1 3 5 2, 我们可以先合并 1、2 堆,代价为 4,得到 4 5 2, 又合并 1,2 堆,代价为 9,得到 9

2022-04-04 20:58:05 153

原创 最长上升子序列(线性动态规划)

最长上升子序列(线性动态规划)题目来源于895. 最长上升子序列 - AcWing题库给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数 N。第二行包含 N 个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000,−109≤数列中的数≤109输入样例:73 1 2 1 8 5 6输出样例:4状态表示:f[i]表示从第一个数字开始计算,以a[i]结尾的最大上升子序列。状态计算:当a[j] < a

2022-03-18 20:46:55 784

原创 常见背包问题(动态规划--DP)

常见背包问题(动态规划dp)题目来源于题库 - AcWing可以对比题目来看。1. 0 1 背包问题核心思想:将每次的最大值分成两个集合,即包含i的最大值和不包含i的最大值,然后取两者的最大值。解析:f[N][N]:当前物品数量和当前体积下的最大值。v[N]:存放体积。w[N]:存放价值。f[i-1][j]:不包含i的最大值。f[i-1][j-v[i]] + w[i]:包含i的最大值。#include<iostream>#include<algorithm>

2022-03-09 17:04:28 946

原创 最小生成树常见算法(Prim、kruskal、染色法、匈牙利算法c++实现)

最小生成树问题1.朴素版Prim(权重正负都实用)举例模拟一遍:4 51 2 11 3 21 4 32 3 23 4 4注意:与Dijkstra算法不同的是Dijkstra算法更新的是每个点到第一个点的最短距离,而Prim算法更新的是到生成树的最短距离。#include<iostream>#include<cstring>using namespace std;const int N = 510 , INF = 0x3f3f3f3f;int g[N]

2022-02-27 22:29:32 900

原创 spfa算法(c++)

SPFA算法(对bellman - ford的优化)(适用于负权边且不能有负权回路)一般情况下spfa算法也可以解决正权边问题,且时间比Dijkstrsa更快(但是如果出题人卡掉了spfa算法,就只能用Dijkstrsa算法了)上一篇博客介绍了bellman_ford算法,建议两个算法一起看区别:bellman_ford算法更新每一个点,而spfa算法只更新变小的点。#include<iostream>#include<cstring>#include<queue&

2022-02-18 20:15:17 923 1

原创 bellman - ford算法c++

(最短路III)bellman - ford算法(适用于含负权边的图)注意:用该算法求最短路,在有边数限制的情况下可以存在负权回路!且对所走的边的数量有要求时只能用该算法实现!解析:因为如果没有边数限制,存在负权回路的时候可能会造成死循环,而有变数限制的时候只循环规定的次数就会跳出循环。思路:每次用上一次更新的点来更新该次的点!a -> b的长度为c (dist[b] = min(dist[b] , last[a] + c) )。强烈建议自己按照这个代码画图走一遍才能理解的更加深刻!代码:

2022-02-17 16:15:09 867

原创 Dijkstra算法求最短路(堆优化版)

堆优化版Dijkstra求最短路思路:上一篇博客介绍的方法每次要找出最小值来更新下一次,而我们可以将每次更新的值直接放到升序的优化队列当中去,就可以少一个循环,将这一步的时间复杂度优化到O(1)。建议结合上一篇博客一起看,理解这两个方法到底有什么本质的不同。上代码:#include<iostream>#include<queue>#include<cstring>#include<vector>#include <algorithm&gt

2022-02-15 17:42:53 375

原创 单源最短路问题(Dijkstra算法)

单源最短路问题单元最短路定义:从起点到其它每一个点的最短距离思路:每次用上一次已经确定的点的最短距离来更新该次每个点的最短距离。下面举个例子来说明:5 71 2 12 3 21 3 21 4 32 5 63 4 44 5 1重点理解:每一次更新都是上一次更新出来的最小值加上这次的值上代码#include<bits/stdc++.h>using namespace std;const int N = 510;int n,m;int g[N][N];boo

2022-02-14 16:23:47 938

原创 截断数列(c++前缀和)

截断数列给定一个由 n位数字组成的序列 a1 a2 … an。其中,每个数字都是 0∼9 之一。请你判断,能否将数列从中间截断为两个或更多个非空部分,要求每一部分的各位数字之和都相等。例如,350178 可以截断为 33 个部分 350、17、8,并且满足 3+5+0=1+7=8。输入格式第一行包含一个整数 n。第二行包含 n 个数字 a1,a2,…,an,数字之间不含空格。输出格式如果可以按要求截断数列,则输出 YES,否则输出 NO。数据范围前 66 个测试点满足 2≤n≤10。

2022-02-13 13:50:45 1098

原创 有向图的拓扑序列(广/宽度优先搜索/图论)

有向图的拓扑序列(宽/广度优先搜索)题目来源于https://www.acwing.com/problem/content/850/给定一个 n个点 m条边的有向图,点的编号是 1到 n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。若一个由图中所有点构成的序列 A满足:对于图中的每条边 (x,y),x在 A中都出现在 y之前,则称 A是该图的一个拓扑序列。输入格式第一行包含两个整数 n和 m。接下来 m行,每行包含两个整数 x 和 y,表示存在一

2022-02-10 19:40:56 596

原创 图中点的层次(c++广度优先遍历)

图中点的层次(树与图的广、宽度优先遍历)[题目来源于847. 图中点的层次 - AcWing题库](847. 图中点的层次 - AcWing题库)给定一个 n个点 m条边的有向图,图中可能存在重边和自环。所有边的长度都是 1,点的编号为 1∼n。请你求出 11 号点到 n号点的最短距离,如果从 1号点无法走到 n号点,输出 −1。输入格式第一行包含两个整数 n和 m。接下来 m行,每行包含两个整数 a和 b,表示存在一条从 a走到 b的长度为 1的边。输出格式输出一个整数,表示 1号点到

2022-02-09 21:26:03 923

原创 树(图)的深度优先遍历(c++数组)

树与图的深度优先遍历存储方式:邻接矩阵(一个二维数组)=> g[ a ] [ b ] = k; => a -->b 的权重为k。相反g[ b ] [ a ] = k; => b -->a 的权重为k。邻接表#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10 , M = 2 * N;int h[N],e[M],ne[M],idx;int n;void add(int

2022-02-09 18:53:23 779

原创 走迷宫(广/宽度优先搜索C++)

走迷宫(广度优先搜索)#include<iostream>#include<queue>using namespace std;typedef pair<int,int> PII;const int N = 110;int g[N][N],d[N][N];queue<PII> q;int n,m;int bfs(){ d[0][0] = 0;//第一个点已经走过,标记为0. q.push({0,0});//将第一个点入队,

2022-02-06 15:57:41 795

原创 八皇后与全排列问题(深度优先搜索)

n-皇后问题#include<iostream>using namespace std;const int N = 20;char a[N][N];bool col[N],dg[N],udg[N];int n;void dfs(int u){ if(u == n) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) cout<<a[i][j];

2022-02-05 16:14:00 309

原创 c++常用STL容器(算法)

STL算法常用容器vector,变长数组,倍增的思想string,字符串,substr(),c_str()queue,队列,push(), front(), pop()priority_queue,优先队列,push(), top(), pop()stack,栈, push(), top(), pop()deque,双端队列set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列unordered_set, unordered_map, un

2022-02-04 13:59:36 117

原创 并查集(c++数组实现)

并查集作用:将两个集合合并(将其中一个集合的根赋值给另一个集合的根做另一个集合的根的儿子)询问两个元素是否在一个集合中(判断两个元素的根是否相同)原理:每个集合用一个树来表示。树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点。问题一:如何判断树根:if(p[x] == x)问题二:如何求x的集合编号:while(p[x] != x) x = p[x];问题三:如何合并两个集合:px是x的集合编号,py是y的集合编号。p[x] = y;优化路径压缩:每次找

2022-01-30 18:23:48 1611

原创 用数组实现(Trie)字典树(高效的存储和查找字符串)

Trie => 高效的存储和查找字符串(集合的数据结构)字典树的性质:根节点不包含字符,除根节点外的每一个子节点都包含一个字符。从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符互不相同。两个有公共节点的字符串它们的前缀相同,所以也叫前缀树。应用字符串的插入操作 void insert(){ int n = str.size(); int p=0; for(int i=0;i<n;i++) {

2022-01-23 15:52:06 938

原创 单调栈与单调队列

单调栈与单调队列1.单调栈单调栈就是去除永远用不到的数据,可以让让栈里面的数据永远有单调性。如果满足这个条件就可以用单调栈来优化。例:acwing-830-单调栈#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int stk[N];int tt;int main(){ cin.tie(0); int m; cin>>m; for(int i=0;i&

2022-01-21 17:12:25 365

转载 数组模拟栈与队列

栈与队列1.栈// tt表示栈顶int stk[N], tt = 0;// 向栈顶插入一个数stk[ ++ tt] = x;// 从栈顶弹出一个数tt -- ;// 栈顶的值stk[tt];// 判断栈是否为空if (tt > 0){ }2.队列// hh 表示队头,tt表示队尾int q[N], hh = 0, tt = -1;// 向队尾插入一个数q[ ++ tt] = x;// 从队头弹出一个数hh ++ ;// 队头的值q[h

2022-01-19 20:58:16 82

原创 c/c++数组模拟链表

链表1.单项链表#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int e[N],ne[N];int head,idx;//初始化void init(){ head = -1; idx = 0;}//在头部插入一个数void add_head(int x){ e[idx] = x; ne[idx] = head; head = idx++;}/

2022-01-19 20:16:09 1088

原创 区间合并模板

区间合并#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;typedef pair<int ,int> PII;vector<PII> A,B;void merge(){ sort(A.begin(),A.end()); int st = -2e9,ed = -2e9; for(auto c : A) { if(ed<c.

2022-01-18 16:31:05 171

原创 离散化算法

离散化 vector<int> alls; // 存储所有待离散化的值 sort(alls.begin(), alls.end()); // 将所有值排序 alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素 // 二分求出x对应的离散化的值 int find(int x) { int l = 0, r = alls.size() - 1; while (l < r) {

2022-01-18 16:29:12 117

原创 双指针(c++实现)

双指针算法模板for (int i = 0, j = 0; i < n; i ++ ) { while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑 } //常见问题分类: //(1) 对于一个序列,用两个指针维护一段区间 //(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作例:Acwing-799最长连续不重复子序列 #include<bits/stdc++.h>us

2022-01-18 16:25:15 817

原创 c++灵活实现前缀和与差分

前缀和与差分1.一维前缀和注意前缀和下标要从1开始,因为边界S0要定义成0。作用:可以快速求出某个数组区间内的和。#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int s[N],a[N];//全局变量默认为0int main(){ int m,n; cin>>n>>m; for(int i=1;i<=n;i++) cin>&

2022-01-14 13:53:42 456

原创 c++实现整数与浮点数二分

二分1.整数二分// 整数二分算法模板bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; // check()判断mid是否

2022-01-09 22:13:17 365

原创 大整数的加减乘除

大整数运算1.加法每一步是三个数相加:Ai + Bi + t;t=进位;#include<bits/stdc++.h>using namespace std;const int N = 1e6 + 10;vector<int> add(vector<int> &a,vector<int> &b){ vector<int> C; int t=0; for(int i=0;i<a.size

2022-01-09 22:08:46 104

原创 快速排序与归并排序

最快的排序快排与归并

2021-12-16 16:47:57 59

原创 多态性

多态性注意事项:多态性是方法的多态,而不是属性的多态多态性不能单独调用子类独有的函数调用函数时,执行子类独有的函数存在条件:有继承关系,方法必须重写,父类引用指向子类对象static方法,属于类,它不属于实例finalprivate这三个均不可能有多态多态举例:public class AnimalTest{ public static void main(String[] args){ AnimalTest test = new AnimalTest(

2021-02-01 17:22:40 101

原创 MarkDown常用语法

MarkDown常用语法标题几级标题就在前面加几个星号加空格字体我是一个大笨蛋加粗我是一个大笨蛋(两边各加两个星号)斜体我是一个大笨蛋(两边各加一个星号)加粗斜体我是一个大笨蛋(两边各加三个星号)加划线(两边各加两个波浪线)引用我的故事很丰富(大于符号加空格)分割线三个减号或者三个星号图片![名字] (路径)超链接点击跳转到百度 [名字](地址)列表ABCABC有序列表(1.+空格)无序列表(-+空格)表格直接右键插入语法|

2021-02-01 12:03:42 71

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除