alogrithm
Lilyan_blog
这个作者很懒,什么都没留下…
展开
-
二叉树的基本操作
二叉树先序和中序确定二叉树后序以及中序确定二叉树// 指针版本struct node{ typename data; node* lchild; node* rchild;}// 二叉树建树前根节点不存在,一般设为NULLnode* root = NULL;// 生成一个新节点, v为结点权值node* newNode(int v) { node* Node = new node; Node->data = v; Node->lchild = Node->原创 2022-03-08 11:47:32 · 457 阅读 · 0 评论 -
A+B for Matrices
1.题目描述This time, you are supposed to find A+B where A and B are two matrices, and then count the number of zero rows and columns.输入The input consists of several test cases, each starts with a pai...原创 2018-11-25 15:46:45 · 287 阅读 · 0 评论 -
计蒜客——节假日
1.问题描述日历有阳历(公历)和阴历(农历)之分。每年都有法定节假日,这些分成三类——双休、阳历节假日、阴历节假日。1.双休1)周六和周日2天2.阳历节假日1)元旦:阳历每年1月1日,放假1天2)劳动节:阳历每年5月1日,放假1天3)国庆节:阳历每年10月1日,放假3天4)圣诞节:阳历每年 12 月 25 日,放假1天3.阴历节假日1)春节:阴历每年1月1日,放假3天2)清...原创 2018-11-23 18:13:27 · 1185 阅读 · 2 评论 -
第六届蓝桥杯代码填空——循环节长度
1.题目描述:要求你在下述代码填充#include <iostream>#include <algorithm>#include <vector>using namespace std;int f(int n, int m) { n = n % m; vector<int> v; for(;;) { ...原创 2018-11-21 09:19:51 · 554 阅读 · 0 评论 -
三大基础排序(冒泡排序,选择排序,插入排序)思想
1.冒泡排序1-1 思想:冒泡排序思想:从数组的下标为0的元素开始,首先将下标为0的下标与数组下标为1的元素比较,如果数组下标1的元素更小,交换,接着比较下标1与下标2的元素,如果下标2较小则交换,反之接着将下标2与下标3比较。。。以此类推,经过n-1趟排序就可以得到结果 。比如5,4,3,2,1第一趟:5,4比较交换。交换后:4,5,3,2,15,3比较交换。交换后:4,3,5...原创 2018-11-07 20:19:39 · 627 阅读 · 0 评论 -
计蒜客打印锯齿矩阵
1.问题描述:2.算法分析:因为发现数组的长度不是固定的,而是可变的,所以我们不能使用静态数组,我们可以使用动态数组vector来做。先确定使用的数据结构vector然后就是先对数组赋值,将比如上题将12个元素赋值,然后有一个要注意的点,就是如果某一行都没有数据,那么,直接换行空一行出来。当没有数据的时候vector数组的长度必然为0再依次打印即可。3.源代码分析:#...原创 2018-11-02 20:19:35 · 387 阅读 · 0 评论 -
C++递归实现十进制转二进制、八进制、十六进制
大家可以关注一下本人自建Blog:http://47.107.118.1841.转二进制与八进制分析我们最熟悉不过的就是短除法将十进制转二进制,将余数倒着输出便是该是十进制的二进制数,那么很容易想到拿十进制数n%2(或者8)这样可以得到最高位的二进制(八进制)数,然后将n/=2(8)继续取余,这样就可以得到下一位,我这里使用字符数组存储,因为2进制只有0-1两个字符,八进制则是0-7 8个...原创 2018-11-04 18:13:40 · 10472 阅读 · 0 评论 -
动态数组vector简介(Java和C++)
1.概念描述:vector名为动态数组有些时候想开一个数组,但是却不知道应该开多大长度的数组合适,因为我们需要用到的数组很可能会根据情况变动。这时候我们就需要用到动态数组。所谓动态数组,也就是不定长数组,数组的长度可以根据我们需要动态改变。动态数组的实现也不难,因为在C++和Java里面已经写好了标准模板库(STL)。C++中动态数组写作vector,Java中写作ArrayList,C...原创 2018-11-02 19:17:27 · 2093 阅读 · 0 评论 -
使用指针实现字符串逆序操作
#include<iostream>#include<cstdio>#include<cstring>using namespace std;void swapp(char &a,char &b) //交换两个字符的位置 { char temp; temp = a; a = b; b = temp;}void wor...原创 2018-11-06 18:22:09 · 8064 阅读 · 0 评论 -
数组中任意几个元素的和是否等于m(递归)
1.问题描述已知一个一维数组,又已知一个整数m。如果能使数组a中几个元素之和等于m,则输出Yes,否则输出No。样例输入:3 3 1 6 6样例输出:Yes2.算法分析其实这道题目意思就是,假定数组为nums,就是让我们判断能否从数组nums取任意数使其和为m对于nums中任意元素nums[n]...原创 2018-11-06 17:34:36 · 4251 阅读 · 0 评论 -
外排序
1.问题描述:假定有两个数组,数组A有序,数组B无序,我们需要找到数组B中不在数组A出现过的元素。样例:数组A{1,3,6,7,9}数组B{5,3,8}从数组B中找出在A没有与之对应的元素。样例输出:5,8。2.算法分析大概我自己想到两种算法:a.就是拿出B的每一个元素与A的每一个元素相比较,当B中每一个元素与一轮A中的每一个元素都比较过后都不相等,则打印该元素。两重循环实...原创 2018-11-01 21:13:13 · 289 阅读 · 0 评论 -
STL库中的集合set简介(C++,Java)
1.简介:集合是数学中的一个概念,通俗地理解,集合是由一些不重复的数据组成的。比如{1,2,3}就是一个有1,2,3三个元素的集合。C++和Jav的标准库中的集合支持高效的插入、删除和查询操作,这3个操作的时间复杂度都是O(lgn),其中n是当前集合中元素的个数。如果用数组,虽然插入的时间复杂度为O(1),但是删除和查询的时间复杂度为O(n),效率太低。C++中我们常用的集合是set,在Ja...原创 2018-11-03 11:34:38 · 1091 阅读 · 0 评论 -
堆积木(动态数组vector)
1.问题描述:2.算法分析:这道题目开始看了好久都没看明白,其实题目大概意思是这样。就是有一排容器,编号为 1,2,3\cdots n1,2,3⋯n,初始时编号为 i的容器有 编号为i的积木。然后有m次操作,每次操作会把容器 aa 的积木都移动到 容器 bb。比如,你输入2 2,说明初始时有两个容器,每个容器中有两个元素。理解样例输入:样例1:第一次12,把第二堆的积木放在...原创 2018-11-03 10:31:33 · 1894 阅读 · 0 评论 -
POJ字符串移位包含问题(详细思路)
1.问题描述:2.算法分析:这道题目是一道比较巧的题目,如果不能找出规律,大多数人都是一个一个循环移位到后面去。其实可以用在这个方法:拿样例举例子:AABCD我们判断CDAA是不是移位后的子串一次移位:ABCDA二次移位:BCDAA三次移位:CDAAB四次移位:DAABC五次移位:AABCD可以发现经过字符串1的长度次移位(这里是五次移位),又回到了原始串。那么其实字...原创 2018-10-30 23:57:32 · 450 阅读 · 0 评论 -
POJ字符串判等
1.问题描述2.算法分析因为题目说不计空格以及忽略大小写,相当于b对B也是可以的。那我们可以将两个字符串的所有内容都转换成小写然后进行判断即可。转换成小写使用cstring库里面的strlwr函数。#include<iostream>#include<cstring>#include<cstdio>using namespace std...原创 2018-10-30 21:15:54 · 316 阅读 · 0 评论 -
C++中sort函数从大到小排序的两种方法
1.sort函数描述而且,sort函数的算法效率相当于快排,使用sort函数有时候可能比我们自己写一个排序算法,可能效率更高。2.使用sort函数排序#include <iostream>#include <algorithm>using namespace std;int main() { int arr[] = {2, 4, 5, 3, 1}; ...原创 2018-11-25 22:09:18 · 104126 阅读 · 6 评论 -
最大子阵
1.题目描述:2.算法分析:其实这道题目最好用的是DP(动态规划)+ 前缀和 组合起来的算法,时间复杂度为O(103),单独用DP为O(104),使用枚举发现还行在这个数据范围内的时间复杂度为O(10^6),但是能效率高还是用效率高的算法。a.使用枚举算法其实就是枚举矩阵的上界下界左界右届,在每个不同的边界围成的矩阵来计算元素和,即可。b.DP…待更新c.Dp+前缀和3.源...原创 2018-11-28 21:15:37 · 167 阅读 · 0 评论 -
图论最短路算法——spfa算法
概述:SPFA–Shortest Path Faster Algorithm是一种单源最短路算法,通常被认为是Bellman-ford算法的队列优化,在代码形式上接近于BFS,是一个实际中一个非常高效的算法,并且可以解决Dijkstra算法中的所不能解决的负边权,但是如果竞赛中有出题人出数据卡你的spfa,你就难受了,所以这里我建议没有负边权,不要轻易使用spfa算法,而是使用优先队列优化的D...原创 2019-05-14 19:29:17 · 1296 阅读 · 0 评论 -
图的遍历——dfs OR bfs
1.什么是图的遍历?从图的某一个顶点出发,沿图中的路径依次访问图中的所有顶点,并且使得图中所有顶点都恰好被访问一次,这一过程即为图的遍历。注意:这里讨论的图特指连通图上进行遍历。2.图的遍历——dfs(深度优先搜索)简介:开始我们假设图上所有的顶点都未被访问,选择图中任一顶点,开始执行以下操作:1.访问当前顶点v,并将该顶点标记为已访问。2.遍历与顶点v相邻的所有顶点c,然后对顶点v所...原创 2019-04-30 20:00:27 · 406 阅读 · 0 评论 -
数论基础——矩阵快速幂模板
1.矩阵简介:2.单位矩阵:3.矩阵的加减:4.常数k与矩阵相乘:5.矩阵与矩阵相乘:矩阵乘矩阵就是要我们模拟线性代数中矩阵求矩阵的公式,新的矩阵的第一个数就等于矩阵A的第一行的每一个元素乘上矩阵B的每一列的元素相加起来得到,那么新的矩阵的第m个元素就等于矩阵A的m行的每一个元素乘以矩阵B的m列每一个元素相加即可。Code:struct matrix { int n,...原创 2019-05-05 20:02:32 · 733 阅读 · 1 评论 -
算法竞赛中一些输出题目的坑点
1.怎么输出多个\首先,我们使用C或C++的标准输入IO流的话两个\或者多个\似乎与OI中的标准输入中的转义字符相冲突,我们可以采用在没输出一个\的时候,在前面多加一个\即可。比如,需要输出\,那么我们就在每个单独的\前多加一个即\\ == \printf("\\\\") ==> \\比如这道题目:哈尔滨工程大学AAC code:#include <cstdio>...原创 2019-04-27 11:23:44 · 454 阅读 · 0 评论 -
蓝桥杯学习之数据结构——图论基础知识简介
##1.图的基本概念:图是由一系列顶点和若干连结顶点集合内两个顶点的边组成的数据结构。数学意义上的图,指的是由一系列点与边构成的集合,这里我们只考虑有限集。通常我们用G = (V, E)表示一个图的结构,其中V表示点集, E表示边集。在顶点集合所包含的若干个顶点之间,可能存在着某种两两关系——如果某两个点之间的确存在这样的关系的话,我们就在这两个点之间连边,这样就得到了边集的一个成员,也就是...原创 2019-04-14 20:58:44 · 1567 阅读 · 0 评论 -
PAT 甲级1059 Prime Factors
1.问题描述:题目意思是给定一个整型范围内的n求出这个n能够分解的质因数,若某一个质因子的分解个数超过一个那么使用^次方表示,比如4 = 2 * 2就要写成4 = 2 ^ 2.这样的形式。2.算法分析:其实这一道题目是一道纯数学知识题,首先我们要理解质因子,质数就是素数,我们需要先用线性筛筛出一定范围的素数,打个表。这里给出埃式筛法,时间复杂度为O(nlogn)#include <...原创 2019-03-18 09:58:51 · 297 阅读 · 0 评论 -
整数划分问题——递归,dfs求解
1.问题描述:给定任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。当n = 7,共有14种拆分方法:2.算法分析:这道题目我们可以想到其实应该用递归来做,而dfs又是可以使用递归求解,我们首先可以在递归函数里进行拆分的枚举,需要拆分的数应该是能够由哪一些数相加,怎样设计递归函数dfs呢,我们应该清楚应该拆分n,比如n为7的时候,我们先拆了1,那么n还剩下6对吧,所以我们设计...原创 2019-02-25 19:32:05 · 627 阅读 · 0 评论 -
搜索入门——全排列问题
1.问题描述:2.算法分析:这道题目其实是搜索入门的一道题搜索,可以使用dfs来搜索,怎么搜索呢,首先我们输入一个n,这个n代表全排列1-n,使用dfs搜索的话,我们要确定边界出口,我们是一步一步去试,每一次次数step + 1,当step比n大的时候就跳出递归,但是我们需要多次搜索,所以需要在选数的时候添加一个记录这个数选与没选的vis标记数组,其实dfs是有模板的,如下:void df...原创 2019-01-29 15:49:06 · 578 阅读 · 0 评论 -
括号匹配问题
1.问题描述:2.算法分析:括号匹配问题是比较经典的问题。我们可以使用栈这样的数据结构来解决。我们扫描字符串压将‘(’入栈中,然后如果是’)’我们则可以从栈中弹出一个’('来与之匹配,这样就可以解决并保证最近的两个括号相匹配了,根据题目要求我们在记录下匹配的位置即可。因为题目中说答案不唯一就是说位置可以换一下。比如样例一输出1 42 3如果我们输出2 31 4这样子也是可...原创 2018-12-22 20:01:27 · 465 阅读 · 0 评论 -
桶排序简介
1.描述什么是桶排序呢,比如你需要输入的数据范围为0-10,需要排序的数的数据范围,那么只需要定义一个大小为11的数组存储你需要的数即可,比如你要排10 6 0 1 1等5个数,那么你就将他们分别放进对应下标的位置即数组a,a[0]存了1个0,a[1]存了2个1,a[6]存了1个6,a[10]存了1个10.然后对这些数排序即可,每一个元素相当于一个桶。有点抽象2.算法分析一开始将元...原创 2018-12-01 18:04:33 · 286 阅读 · 0 评论 -
搜索入门——小学数学问题
1.问题描述:2.算法分析这道题目使用暴力枚举以及dfs(深度优先搜索)都可以解决。a.暴力枚举:首先我们需要确定枚举的范围:这道题目有12个空,如果枚举12个空的值则需要写12个循环,程序会跑不起来。其实我们只需要枚举算式左边的八个空格,然后右边的空格通过计算来判断即可,这样就是8个循环,全部枚举完就是128这样一个时间复杂度,通常计算机计算1s的时间复杂度是109差不多接近了,...原创 2018-12-03 08:48:38 · 617 阅读 · 0 评论 -
计蒜客——浮点数排序
1.题目描述:2.算法分析:首先肯定是定义一个double类型数组存放数据,然后的一个问题是怎么判断浮点数最近的整数的差,使用round函数即可floor : 不大于自变量的最大整数ceil :不小于自变量的最大整数round:四舍五入到最邻近的整数floor(),ceil() 需包含头文件math函数库具体可以查C++帮助文档然后我们使用C++的sort函数进行排序,...原创 2018-11-27 15:06:28 · 2482 阅读 · 0 评论 -
蓝桥杯——四平方和
1.问题描述:2.算法分析:这道题目简单粗暴,枚举暴力算法,但是你不能死死的写四个for循环去判断,适当的剪枝会使得你的程序跑起来更快,并且需要注意不要你输出全部的组合,只要输出按照字典序排序输出。什么是字典序?这么说吧在这里比较的就是你的ASCALL值把,0的比1小,字母a比A大,所以你枚举只需要输出最小的能满足条件的a,b,c,d就要跳出所有循环了。如果不是只求出字典序最小的组合,...原创 2018-11-29 20:59:10 · 591 阅读 · 0 评论 -
POJ过滤多余的空格
1.题目描述:2.算法分析:首先,要过滤掉多余的空格,我们如果一个一个删除空格是一件很麻烦的事,不妨我们可以从每个单词的后面加一个空格,这样是不是会比把多余空格删除好一些呢。怎么做?一个知识点大家要了解,字符串的输入方式有两种//1.scanf是从光标开始的地方读到空格就结束了,也就相当于读一个单词scanf("%s",&str);//2.gets()是从光标开始...原创 2018-10-30 20:27:26 · 635 阅读 · 0 评论 -
POJ找第一个只出现一次的字符(多种方法)
1.问题描述2.算法分析a.我这里使用的是最笨的方法,就是每一次取出字符串中的一个字符依次比较,我是将输入的字符串复制到另一个字符串,然后逐一比较,因为要找到第一个没有重复的字符。那么就相当于找到以后马上跳出循环。没有重复出现的字符必然只有一个,经过循环判断可得。b.听朋友说也是可以使用128个ASCALL值判断,就是将每次输入的ASCALL值读取,然后对每次输入的ASCA...原创 2018-10-31 21:11:38 · 1030 阅读 · 0 评论 -
汉诺塔问题求解
汉诺塔问题是一个典型的递归问题。怎么去理解?实际上就是给你3个固定的圆柱,然后给你若干个盘子在起始圆柱上通过挪动依次搬到最后一根圆柱,但是还是要按照圆盘的大小从小到大排列。具体描述以及三个圆盘的搬移。上图可以看到要完成操作需要执行七次操作,我们再来看4个圆盘的操作可以很清楚的发现是15次移动即可完成我们往前推移,发现1个圆盘则需要移动一次即可,两个圆盘即可挪动3...原创 2018-09-27 19:47:00 · 2706 阅读 · 0 评论 -
NOI题库地球人口承载力估计
因为地球上现有资源加上新生资源可供x亿人生活a年,y亿人生活b年,我们假设1单位的量为1亿人生活1年的资源,然后我们只要输入的两者的差值即为最多养活的人数。 源代码:#include<cstdio>int main(){ int x,a,y,b; double z; scanf("%d%d%d%d",&x,&a,&y,&b)...原创 2018-10-05 12:40:35 · 1236 阅读 · 0 评论 -
分解质因数(合数)
把一个合数分解成若干个质因数乘积的形式比如输入:36输出:2*2*3*3思路:我们可以知道最小的质因数为2,我们应该从最小的质因数开始尝试,比如36先与2相除若能整除那么2必然是满足的,然后从36/2=18在拿2试,如果还能整除就继续拿9/2发现不能整除,我们在拿2+1=3来尝试,我们以此类推,最后当原来的数为1就可以结束了。算法思想:就是通过枚举一个一个尝试从最小的质因数,就是枚...原创 2018-10-11 21:58:46 · 1669 阅读 · 0 评论 -
栈排序(空间复杂度O(1))
如果要将空间复杂度为O(1),那么就不能够声明数组来申请空间了只有两个堆栈可以使用。那么我们该怎么去实现排序了,因为堆栈是后进先出,只有一端能进入和出去,这就使得问题复杂了。其实我们可以不再另申请空间也能完成排序。比如,一个输出栈S,输入栈R,我们每次将输入栈的元素push进入输出栈S,但是因为我们的输出栈元素需要排序,假定从栈底到栈顶按照从小到大的顺序排列,那么我们如果输入的栈的...原创 2018-09-20 00:31:42 · 3544 阅读 · 0 评论 -
最近点对问题
最近点对问题描述:最近点对问题就是在二维平面坐标里的n个坐标里寻找出两个点之间的距离最短。1.(枚举法)枚举法做的话很容易理解,我们就是将两点坐标定义于二维数组中,然后我们通过循环计算每两个点的最短距离,找到最短距离即可输出并打印最短距离两点的坐标。源代码实现:#include<iostream>#include<cmath>using namesp...原创 2018-09-23 20:30:44 · 1114 阅读 · 0 评论 -
插入排序算法分析
插入排序的算法思想是我们给定一个数组,首先我们将第一个元素a[0]视为排序好的数,这里称为已排序好的数列然后,我们将数组中的第二个元素插入到已排序好的数,依次类推举例:比如一个数组存储的元素为{8,3,1,5,2,1}第一步我们假设8为已经排序号的数列第二步,然后设置一个循环从i=1开始到n-1(n是指数组中存在多少个元素),比如i=1时,我们将这个数和排序好的数字比较,如...原创 2018-08-04 15:49:39 · 264 阅读 · 0 评论 -
Maximum Profit
最大利益:Maximum Profit计算出价格差Rj-Ri(其中j>i)的最大值输入示例:6531343输出示例:3这道题目首先我们拿到手,首先我们应该想到使用数组去做存储输入的数据,但是我们需要注意的是价格差的计算就相当于一个数组中元素相减,但是这里有一个条件必须是j>i,第一种方法,设定两个for循环forj从1到n-1...原创 2018-08-03 16:32:58 · 502 阅读 · 0 评论 -
Java中串的分割
在处理字符串中Java比C、C++更加简便,Java中提供了非常强大的String类库对字符串分割比如给定一个字符串,你需要求其中的一些子字符串“”aaa bbb,ccc,dddd“”将子字符串求出我们在Java中可以通过.length()的方法求得这个字符串的总长度,然后通过.charAt()方法求每个字符串中的字符那么这道题目我们可以通过遍历该字符串中的每个字符来求解。代码:/* * @ly...原创 2018-07-14 19:51:18 · 191 阅读 · 0 评论