
数据结构与算法
不要影响我叠Q
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
蓝桥杯C++研究生组2020国赛循环小数
题目描述已知SS是一个小于11的循环小数,请计算与SS相等的最简真分数是多少。例如0.3333 \cdots0.3333⋯等于\frac{1}{3}31,0.1666\cdots0.1666⋯等于\frac{1}{6}61。输入描述输入第一行包含两个整数pp和qq,表示SS的循环节是小数点后第pp位到第qq位。第二行包含一个qq位数,代表SS的小数部分前qq位。其中,1 ≤ p ≤ q ≤ 101≤p≤q≤10。输出描述...原创 2021-06-04 11:14:13 · 516 阅读 · 0 评论 -
蓝桥杯2020决赛C++研究生组重复字符串
题目描述如果一个字符串SS恰好可以由某个字符串重复KK次得到,我们就称SS是KK次重复字符串。例如abcabcabc可以看作是abc重复33次得到,所以abcabcabc是33次重复字符串。同理aaaaaa既是22次重复字符串、又是33次重复字符串和66次重复字符串。现在给定一个字符串SS,请你计算最少要修改其中几个字符,可以使SS变为一个KK次字符串?输入描述输入第一行包含一个整数KK。第二行包含一个只含小写字母的字符...原创 2021-06-04 08:38:00 · 1334 阅读 · 2 评论 -
蓝桥杯C++B组2017决赛铺瓷砖
参考自蓝桥杯国赛特训营题意有一个 3×10 的空地,往里面铺 1×2 的瓷砖,瓷砖有两种颜色(橙色和黄色),并且任意一个 2×2 的空地的瓷砖颜色不能相同,问共有几种贴法。分析数据范围很小,只用铺下3 * 10 / 2 = 15块瓷砖,所以可以枚举所有瓷砖得摆放方式以及颜色。用深搜枚举每块瓷砖的颜色,当所有瓷砖都贴完并且合法时,记录答案。空地状态g[x] [y]:-1表示未贴瓷砖,0 表示橙色,1 表示黄色。当dfs枚举到任意一块没有上色的空地时,有两种贴瓷砖方法(横向...原创 2021-05-22 12:47:59 · 723 阅读 · 0 评论 -
蓝桥杯C++B组决赛---凑平方数
题意把 0-9 这 10 个数字,不重不漏分成多个组,每个组恰好是一个平方数。问有多少种分组方法?分析若要暴力枚举需要分成几组数字,每个组需要分哪些数字,时间复杂度为枚举分组个数 * 枚举每个分组的数字不能接受。换种思路,先确定分组,保证每一组自身都是完全平方数,再考虑把完全平方数组合起来,复杂度可以拆分成预处理完全平方数 + 组合完全平方数。0-9 能组合出的数字最大为 9876543210,不超过 1e10,可以枚举 1~1e5 的平方并判断是否满足每个数字最多出现一次,为了方便之后的.原创 2021-05-22 12:07:44 · 301 阅读 · 0 评论 -
二分查找的理解
常见的二分模板:模板一,区间是左闭右闭的,即查找区间是[l,r]int binary_search(int l, int r, int a[], int x) //返回值是元素x在数组a中的位置(下标){ int mid = 0; while(l <= r) { mid = (l+r) >> 1; if(a[mid] == x) return mid; if(a[mid] <原创 2021-04-20 17:02:20 · 150 阅读 · 0 评论 -
图的邻接链表的三种写法
const int N = 1e5+1;struct Edge{ int to; int w; Edge(int t = 0, int w_ = 0) : to(t), w(w_) {}};vector<Edge> H1[N];vector<vector<Edge>> H2;vector<unordered_map<int, int>> H3;int main(){ H2.resize(.原创 2020-08-21 16:06:48 · 587 阅读 · 0 评论 -
线段树的理解---摘自李煜东的《算法竞赛进阶指南》对应章节
线段树是一种基于分治思想的二叉树 结构,用于在区间进行信息统计。其特点包括如下:线段树的每一个节点都代表一个区间。 线段树具有唯一的根节点,代表的区间是整个统计范围,如[1,N] 线段树的每一个叶节点都代表一个长度为1的元区间[x,x]。(加上线段树的非叶子节点,联合线段树本质是个完全二叉树的性质,所以一般来说线段树总共有N<<1-1个节点,但是在这种存储方式下,最后还有一层会产生空余。所以保存线段树的数组长度要不小于N<<2才不会产生数组越界的情况) 对于每...原创 2020-07-13 16:22:17 · 608 阅读 · 0 评论 -
斐波那契数列log(n)时间复杂度解决方案---LeetCode70题代码
代码思路百度一大把,我主要是自己撸了遍,通过过了LeetCode测试。截图如下:vector<vector<int> > operator * (const vector<vector<int> >& a, const vector<vector<int> >& b) //矩阵乘法操作符重载{ int m = a.size(), n = a[0].size(); int n2 = b原创 2020-06-10 00:12:30 · 406 阅读 · 0 评论 -
树状数组和线段树的理解
-----感谢SDU-ACM的教程分享,具体教程可在B站上搜索树状数组总结: 1、思想:按照2的整数次幂进行分解,把一个前缀区间分解成若干个长度为2的整数次幂的小区间。例如[1,6]分解为6=4+2,即: [1,4]和[5,6] 2、lowbt(x)函数:获取整数x的2的整数次幂的拆分中,最小的那个2次幂(也即:1中所说的拆分中区间长度最短的那个区间的长度) 3、...原创 2020-02-08 11:24:45 · 270 阅读 · 0 评论 -
递归的本质
特别声明,以下大部分内容摘自李煜东的《算法竞赛进阶指南》 理解递归,首先要从函数调用说起。实际上,一台32台的计算机采用“堆栈结构”来实现函数调用,它在汇编语言中,按照函数参数从右至左的顺序依次入栈(大部分编译器貌似都是从右至左),然后指向call(Address)指令。该指令把返回地址(当前语句的下一条语句)入栈,然后跳转到address位置的语句。在函数返回时,它指行ret指令。该指令...原创 2019-12-25 11:24:01 · 649 阅读 · 0 评论 -
二叉树的线索化(摘自天勤数据结构高分笔记)
/************************************************************************//* 二叉树的线索化:二叉树的线索化可以将二叉树非递归遍历算法中的用户栈也给省掉,进一步提高效率 中序线索二叉树的结点结构如下: ______________________________________ ...原创 2018-11-14 18:07:33 · 796 阅读 · 0 评论 -
使用vector的resize()函数过程中踩的坑
最近在学习写一些算法的代码用到了动态数组,主要思路是:在命令行中输入数组的大小,然后再调用vector::resize()函数重新分配创建的vector对象的大小,从而实现动态数组的目标。但是在实践中发现,这个resize()函数貌似工作不正常,代码中如果写了这个函数,代码的输出是没有任何结果的。代码如下(代码是CCF201409-3 字符串匹配的答案,通过了用例测试):/*********...原创 2019-05-29 14:00:14 · 4630 阅读 · 0 评论 -
求平方根 C++代码
递归版:float recursion(float A, float e, float p = 1) // A为平方数,e为误差,p为A的平方根,下同{ if (fabs(A- p*p) <= e) { cout << p << endl; return p ; } return recursion(A, e, (p + A / p) / 2...原创 2019-07-08 21:08:43 · 3995 阅读 · 0 评论 -
考研数据结构 图的四种算法 ---- 来自天勤高分笔记
/******************************* 最小代价生成树之普利姆算法思想:-----------贪心算法思想 从图中任意取出一个顶点,把它当成一棵树,然后从与这棵树相邻接的边中选取一条最短(权值最小) 的边,并将这条边及其所连接的顶点也并入这棵树中,此时得到了一颗有两个顶点的树。然后从于这棵树 相邻接的边中选取一条最短的边,并将这条边及其所连接的顶点并入当前树中,...转载 2019-07-19 09:04:33 · 1769 阅读 · 0 评论 -
堆排序算法
1、自己手动实现版本-----来自《天勤数据结构高分笔记》//堆排序//1、小根堆的结点调整函数void shift(vector<int>& R,int low,int high){ int i = low, j = low * 2; //R[j]为R[i]的左孩子 int temp = R[i]; while (j <= high) { ...原创 2019-07-26 00:32:31 · 201 阅读 · 0 评论 -
终于发现了算法设计思想(动态规划、图论等)的出处了
个人发现这些算法的思想貌似都是来自《运筹学》,忽然想起来大学学这门课的时候我在王者荣耀。现在,悔不当初啊。今年考研结束了后非得再好好温习温习这门课...原创 2019-08-01 10:02:37 · 474 阅读 · 0 评论 -
DFS遍历模板 --- 图上方格四周处理(三消算法等等)
#include<bits/stdc++.h>//挑战程序设计竞赛 using namespace std;int N , M;vector<vector<char> > grid;vector<vector<bool> > can_goal; struct direct{ int x, y;}dire[4...原创 2019-08-14 10:20:25 · 502 阅读 · 0 评论 -
CCF 2019-03-17 第二题24点
#include<bits/stdc++.h>using namespace std;int n;int calculate(int first, int second , char operation){ switch (operation) { case '+': return first + second; case '-': return...原创 2019-08-09 17:17:25 · 336 阅读 · 0 评论 -
图的两种遍历方式:DFS和BFS -----摘自《天勤数据结构高分笔记》并做了写修改,使用了STL中的数据结构实现
//图的邻接表示static struct ArcNode { int adjvex; //该边所指向的节点的位置 struct ArcNode* nextarc; //指向下一条边的指针 int info; //该边的信息};static struct VNode { char data; ...原创 2019-09-30 16:38:21 · 479 阅读 · 0 评论 -
函数功能单一化的好处
在编程时,一个函数功能单一化不仅仅只是有降低耦合性的好处,在避免一些很深或者很容易忽略的bug也很有帮助。请看下面的问题代码(原题是CCF2014年最优配餐问题,这个算法并不是正确的。算法 正确性并不是本文的重点):#include <iostream>#include<queue>#include<vector>using namespace st...原创 2019-05-24 01:19:34 · 812 阅读 · 0 评论 -
图上的相邻点的递归遍历的理解
对于图(实质上在编程中我们都用的是二维数组来存储)的相邻点的递归遍历模板如下:int viss[MAXN][MAXN]; //或者用标准库来创建二维数组:vector< vector<int> > Vss(MAXN , verctor<int>( MAXN , 0 ) )//多嘴一句:一般在使用vector的时候,尤其是在函数内部使用的时候,一定要...原创 2019-05-17 10:20:29 · 595 阅读 · 0 评论 -
判断序列(数组)中的主元素
/*算法之判断序列中的主元素题目:已知一个整数序列A=(a0,a1,a2.......an),其中 0 <= ai < n 。若存在ap1 = ap2 = ap3 =......apm =X,且m > n/2,( 0 <= pk < n ,1 <= k <=m ) ,则称X为序列X的主元素。例如 A = ( 0,5,5,3,5,7,5,5),则5是序...原创 2018-11-12 17:57:52 · 1822 阅读 · 0 评论 -
n个字符全排列问题(递归版本)
/************************************************************************//* n个字符全排列问题递归版 分析:设str是n个不同字符的字符串,perm(str,k-1,n)为str[0]到str[k-1]的所有字符的全排列 ,perm(str,k,n)为str[0]到str[k]的所有字符的全排列,pe...原创 2018-11-12 21:23:03 · 1984 阅读 · 0 评论 -
KMP算法以及其核心next数组
/* KMP算法核心之next数组 设字符串数组为ch[n],对应的next数组为next[n] 1、则必有next[0]=-1(此时数组ch和next的开始下标都为0)或者 next[1]=0(此时数组ch和next的开始下标都为0) 以及next[2]=1; 2、当i>=2时,判断ch[i]和ch[j]是否相等, ...原创 2018-11-12 23:28:43 · 270 阅读 · 0 评论 -
二叉树遍历模板以及一些例子
//二叉树三种遍历模板(本文直接摘自天勤考研数据结构第六章)void Travel(BTNode *p){ if (p != NULL) { //(1) Travel(p->lchild); //(2) Travel(p->rchild); //(3) } /**...原创 2018-11-14 15:08:12 · 680 阅读 · 0 评论 -
二叉树遍历算法非递归版本
//二叉树的遍历算法之非递归版本(摘自天勤考研之数据结构第六章)/************************************************************************//*前面介绍的二叉树深度右边遍历算法都是通过递归函数实现的,这时很低效的。原因在于递归算法使用了系统提供的栈。并且在这个系栈中还做了诸如保护现场和恢复现场等复杂的操作,才使得遍历可...原创 2018-11-14 16:29:46 · 453 阅读 · 0 评论 -
最短路径算法:迪杰斯特拉算法和弗洛伊德算法(天勤数据结构高分笔记)
迪杰斯特拉算法算法思想: 设有两个顶点集合S和T,集合S存放途中已经找到最短路径的顶点,集合T存放的是途中剩余顶点。初始状态是,集合S只包含源点V0,然后不断从集合T中 选取到顶点V0的路径长度最短的顶点Vu并入到初始集合中。集合S每并入一个新的顶点Vu,都要修改顶点V0到集合T中顶点最短路径长度值。不断重复此过 程,直到集合T中所有顶点全部并入到S中为止。 在理解...原创 2018-11-18 11:17:17 · 3863 阅读 · 0 评论 -
拓扑排序以及迪杰斯特拉算法和弗洛伊德算法的一些例子(天勤数据结构)
拓扑排序核心算法 在一个有向图中找到一个拓扑排序的过程如下: 1)从一个有向图中选择一个没有前驱(入度为0)的顶点输出; 2)删除1)中的顶点,并删除从该顶点出发的全部边; 3)重复上述两步,直到剩余的图中不存在没有前驱顶点为止(此时图全部顶点都已经输出) 拓扑排序存在的条件是图中不存在环 为使能从途中选取出入度为0的结点并将其进行输出,要对邻接表...原创 2018-11-20 22:51:45 · 826 阅读 · 0 评论 -
排序算法(天勤数据结构高分笔记)
排序算法直接插入排序算法:每趟将一个待排序的关键字按照其值的大小插入到已经排好的部分有序序列的适当位置上,直到所有待排关键字都被插入到有序序列中为止void InsertSort(int R[], int n) //代拍关键字存储在R[]中,默认为整形,个数为n{ int i = 0, j = 0; int temp = 0; for (i = 1; i ...原创 2018-11-21 00:12:33 · 2235 阅读 · 0 评论 -
归并排序算法
二路归并排序,快速排序算法和归并算法采用都是分治思想//有序合并两个数组void Merge(int A[], int Temp[],int Low, int Mid, int High){ int i = Low , j = Mid + 1, k = Low; while (i <= Mid && j <...转载 2018-11-22 21:23:16 · 137 阅读 · 0 评论 -
BFS模板
//BFS算法模板void BFS(int s) //此处参数类型可变{ queue<int> q; q.push(s); while (!q.empty()) { //访问队首元素 q.front()函数 //队首元素出队 q.pop()函数 //将队首元素的队首结点的下一层结点中未曾入队的结点全部入队,并设置对应的标签已经入队 }} ...原创 2019-02-20 23:39:09 · 412 阅读 · 0 评论 -
约瑟夫环问题
问题描述:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常,我们会要求输出最后一位出列的人的序号。问题解法:https://blog.youkuaiyun.com/sinat_38972110/article/details/82150081首...转载 2019-02-24 20:20:54 · 477 阅读 · 0 评论 -
递归算法的理解
一般递归算法是由递归出口和递归转移函数构成的(类似于动态规划中的状态转移方程)。一般递归算法框架为:返回值 函数名(形参列表){ if (出口条件) { return 返回值 } else { 根据状态转移方程递归调用自身 return 返回值 }}但是看博客的时候,很多时候这些大佬们都...原创 2019-05-17 09:46:19 · 379 阅读 · 0 评论 -
五大算法之分支界限法
基本思想 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树,裁剪那些不能得到最优解的子树以提高搜索效率。搜索策略 在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。为了有效地选择下一个扩展结点,以加速搜索的进程,在每一活结点处,根据限界函数估算目标函数的可能取值(优先值),并根据这些已计算出的函数值,从当前活结点表中选择一...转载 2019-04-25 16:22:08 · 5676 阅读 · 0 评论 -
五大算法思想之回溯算法
以下内容摘抄自《计算机算法设计与分析 王晓东著 配套的PPT》有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最优解时,往往要使用回溯法。回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。回溯法有“通用解题法”之称。回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解...转载 2019-04-25 16:08:23 · 1177 阅读 · 0 评论 -
五大算法思想之贪心思想
原文内容来自《计算机算法设计与分析 王晓东配套PPT》用贪心法求解问题应该考虑如下几个方面:(1)候选集合C:为了构造问题的解决方案,有一个候选集合C作为问题的可能解,即问题的最终解均取自于候选集合C。例如在找零钱问题中,各种面值的货币构成候选集合。(2)解集合S:随着贪心选择的进行,解集合S不断扩展,直到构成一个满足问题的完整解。例如在找零钱问题中,已付出的货币构成解集合。3)可行...转载 2019-04-25 13:58:38 · 1287 阅读 · 0 评论 -
C++字符串字典序最小问题(代码来自《挑战程序设计竞赛-----巫泽俊译》)
/*最小字典序:题目描述:给定长度为N的字符串为S,要构造一个长度为N的字符串T。起初,T 是一个空串,随后反复进行下列任意操作。①:从S的头部删除一个字符串,加到T的尾部,②:从S的尾部删除一个字符,加到T的尾部目标是要构造字典序尽可能小的字符串T。(字典序是指从前到后比较两个字符串大小的方法。首先比较第1个字符,如果不同则第1个字符较小的字符串更小,如果相同则继续比较第2...转载 2019-03-13 00:12:52 · 2420 阅读 · 0 评论 -
贪心算法 ----今年暑假不AC
答案来自王道出版的书籍《计算机考研机试指南》 思路:如果最优解的第一个就节目并不是结束最早的节目,那么我们可以直接用结束时间最早的节目代替该解中的第一个节目,替换后的阶也是最优解。这样我们就可以得出当第一个节目选择所有节目中结束时间最早的节目,这样一定不会得不到最优解的。于是,在我们所要求得最优解中,第一个被收看的节目可以安排所有节目中结束时间最早的节目(若有多个,则可以任意选择一个)。只有...转载 2019-03-11 23:18:56 · 492 阅读 · 0 评论 -
C++算法之括号匹配问题
bool judge(const string& temp, stack<char>& test){ int i =0; char stack_pop_char; while(i < temp.size() ) { //遍历字符串,左括号和其他字符入栈,其他类型字符出栈 if(temp[i] =='(' || temp[i] == '[' |...原创 2019-03-09 14:06:23 · 1658 阅读 · 0 评论 -
C++复合数据类型进行比较排序的方法
#include<iostream>#include <algorithm>using namespace std;//方法一:自定义比较子struct E { char name[10]; int age; int score;};//按照成绩排序,成绩相同按照名字排序,否则按照年龄排序bool cmp(E a, E b) { if (a.s...原创 2019-03-09 12:07:16 · 273 阅读 · 0 评论