算法笔记
文章平均质量分 52
奇迹是执着的人创造的
这个作者很懒,什么都没留下…
展开
-
算法笔记 9.7 堆
9.7.1 堆的定义与基本操作堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子结点的值。大顶堆:父节点值>=孩子结点的值此时父节点的值为子树最大小顶堆:父节点值<=孩子结点的值此时父节点的值为子树最小(堆一般用优先队列实现,而优先队列默认大顶堆,一下仅讨论大顶堆)定义及向下调整代码:const int maxn=...原创 2019-04-20 00:05:20 · 203 阅读 · 0 评论 -
算法笔记11.2~11.6 最大连续子序列和 最长不降子序列(LIS) 最长公共子序列(LCS) 最大回文子串 DAG最长路
11.2最大连续子序列和给定一个数字序列A1,A2,...,An,求i,j(1<=i<=j<=n),使得Ai+..+Aj最大,输出这个最大和样例: -2 11 -4 13 -5 -2 显然11+(-4)+13=20为和最大的选取情况暴力:O(n^2) dp:O(n)A[i]记录序列记dp[i]为以A[i]结尾的连续序列(将问题划分为子...原创 2019-03-22 18:54:26 · 294 阅读 · 1 评论 -
算法笔记 11.1 动态规划的递归写法和递推写法
动态规划(Dynamic Programming,DP)是一种用来解决一类最优化问题的算法思想。将一个复杂的问题分解成若干子问题,通过综合子问题的最优解来得到原问题的最优解。注意:dp会将每个求解过的子问题的解记录下来,下次遇到同样的问题时,就可以直接使用之前的记录的结果而不是重复计算。1.动态规划的递归写法(记忆化搜索) 自顶向下记录子问题的解,来避免下次遇到相同子问题时重复计算递归...原创 2019-03-22 16:43:20 · 379 阅读 · 0 评论 -
贪心 分治 与 动规 异同点分析
两个概念:重叠子问题:如果一个问题可以被分为若干个子问题,且这些子问题会重复出现,那么就称这个问题拥有重叠子问题最优子结构:如果一个问题的最优解可以由其子问题的最优解有效地构造出来,那么称这个问题拥有最优子结构三者各自特点:分治:(分而治之),将原问题划分成若干个规模较小而结构与原问题相同或相似的子问题,然后分别解决这些子问题,最后合并子问题的解,即可得到原问题的解。分治必须...原创 2019-03-22 16:18:17 · 1223 阅读 · 0 评论 -
算法笔记7.3 链表
自己实现单链表 指针实现create search insert del#include<iostream>using namespace std;struct node{ //数据域和指针域即可 int data; node* next;};//创建一个单向链表 根据数组来初始化相应结点node* create(int Array[]...原创 2019-03-13 15:42:15 · 159 阅读 · 0 评论 -
算法笔记7.2 队列的应用
队列先进先出 ,每次只能取到队首元素,只能在队尾插入元素。两个指针,front和rearfront队首元素位置的上一个位置rear队尾元素的位置自己简单实现一个int型队列#include<iostream>using namespace std;struct Queue{ int front; int rear; int q[1000]; //...原创 2019-03-12 16:54:43 · 297 阅读 · 0 评论 -
算法笔记6.8 小工具pair
pair是一个很实用的小玩意可以理解为一个写好的结构体 有两个成员,成员的类型由我们自己定struct pair{ type1 first; type2 second;};1.pair的定义头文件#include<utility>或者直接#include<map>pair<string,int> p;pair<...原创 2019-03-12 14:43:20 · 200 阅读 · 0 评论 -
c++结构体做函数参数问题 vector做参数问题
1.结构体名传递的也只是副本2.结构体指针做形参 实参传递结构体名地址 才是地址传递#include<iostream>using namespace std;struct node{ int age; node(){age=0;} node(int age){this->age=age;}};void add1(node no){ no.age...原创 2019-03-16 20:15:25 · 1125 阅读 · 0 评论 -
c++程序记时模板 测试程序运行时间
有时为了测试程序运行时间,或者程序陷入了死循环,要不定期打印某些变量的值,又懒得打断点,太麻烦,此时可以定期输出程序变量值,观察运行情况下面给出c++计时模板 前不久为启动和关闭oracle服务写脚本的时候用到了,今天写bfs直接复制过来用了下,发现不错,记录下#include<iostream>#include <ctime>using namespace...原创 2019-03-16 18:57:09 · 284 阅读 · 0 评论 -
算法笔记 8.2 BFS
1.BFS模板//BFS模板void BFS(int s){ queue<int> q;//定义队列 q.push(s);//起始结点入队 while(!q.empty()){//非空循环 取出队首元素top; 访问队首元素top; 队首元素出队; 将top的下一层结点中未曾入队的结点全部入...原创 2019-03-16 20:48:13 · 300 阅读 · 0 评论 -
算法笔记7.1 栈的应用
1.自己实现栈的clear,size,empty,pop,topTOP本质上为·最大元素的下标,栈空时为-1#include<iostream>#include<stack>using namespace std;const int MAXSIZE=1000;struct Stack{ int st[MAXSIZE]; int TOP; S...原创 2019-03-12 11:29:56 · 354 阅读 · 0 评论 -
算法笔记6.7 stack
栈stack1.push,pop,top#include<iostream>#include<stack>using namespace std;int main(){ stack<int> st; for(int i=1;i<=5;i++){//1 2 3 4 5 st.push(i); } for(int i=1;i&...原创 2019-03-12 10:20:12 · 194 阅读 · 0 评论 -
算法笔记6.3 string
1.输入输出str.lengh()/str.size() 两个函数都可以取得string的长度,元素个数直接cin cout输入输出非要用printf()输出得str.c_str() 转换成c语言中的字符数组#include<iostream>#include <cstdio>#include<string>using namespace...原创 2019-03-07 18:03:32 · 274 阅读 · 0 评论 -
算法笔记 9.1 树与二叉树
9.1.1 树的定义与性质记住以下性质:其中1和5经常被用来出边界数据 1.树可以没有结点,这种情况下把树称为空树 2.树的层次(layer)从根结点开始算起,即根结点为第一层,根结点子树的根结点为第二层,以此类推 3.把结点的子树课数称为结点的度(degree)(即:树结点的度指的是该节点孩子的个数.没有出度入度之分), 而树中结点的最大的度称为树的...原创 2019-04-03 21:54:06 · 958 阅读 · 0 评论 -
11.6 DAG最长路
DAG:有向无环图1.求整个DAG中的最长路径(即:不固定终点和起点)2.固定终点,求DAG中的最长路径问题1给定一个有向无环图,如何求解整个图的所有路径中权值之和最大的那条令:dp[i]表示从i号顶点出发能获得的最长路径长度。dp[i]的最大值即是DAG的最长路径长度dp[i]=max{ dp[j]+length(i->j)}j是i的所有直接...原创 2019-03-23 01:07:37 · 651 阅读 · 1 评论 -
算法笔记9.5 平衡二叉树(AVL树)
9.5.1 平衡二叉树的定义上一节的二叉二叉查找树BST,若按照顺序插入,会退化为一条链,eg:使用序列{1,2,3,4,5}构建二叉树,会得到于是需要对树的结构进行调整,使得树的高度在每次插入元素后仍然能保持O(logn)的级别,这样就产生了平衡二叉树。所谓平衡二叉树是指:对AVL树的任意结点来说,其左子树与右子树的高度之差的绝对值不超过1(左右子树的高度之差称为该结点的平衡因...原创 2019-04-18 21:53:07 · 752 阅读 · 1 评论 -
算法笔记 10.4.1 最短路径 Dijkstra
最短路径要解决的问题对任意给定的图G(V,E)和起点S和终点T,如何求从S到T的最短路径Dijkstra、Bellman-Ford、SPFA、Floyd10.4.1 Dijkstra算法解决单源最短路径问题,即给定图G和起点s,通过算法得到S到达其他各点的最短距离Dijkstra伪代码//dijkstra伪代码//G为图,一般设成全局变量...原创 2019-05-02 00:18:30 · 516 阅读 · 0 评论 -
10.3 图的遍历
10.3.1 DFS遍历图1.用DFS遍历图邻接矩阵版:const int MAXV=1000;//最大顶点数const int INF=1e9;//无穷大//邻接矩阵DFSint n,G[MAXV][MAXV];//n为顶点数,MAXV为最大顶点数bool vis[MAXV]={false};//如果顶点i已被访问,则vis[i]=true,初值为falsevoid ...原创 2019-04-26 10:59:29 · 147 阅读 · 0 评论 -
算法笔记 10.1 图的定义和相关术语 10.2 图的存储
图:由顶点(Vertex)和边(Edge)组成无向图:顶点的度是指和该顶点相连的边的条数。有向图:入度:入边条数 出度:出边条数边权和点权不一样: 顶点和边都可以有一定属性,量化的属性称为权值,顶点的权值和边的权值分别称为点权和边权。 eg:点权:城市里资源的数目 边权:两个城市之间来往所需要的时间或花费10.2 图的存储图的存储两种方式...原创 2019-04-20 21:42:23 · 154 阅读 · 0 评论 -
算法笔记 9.8 哈夫曼树(最优二叉树)
9.8.1 哈夫曼树(建树思想)上一节墓地最后一题合并果子的思想就是哈夫曼树建树思想#include<iostream>#include<algorithm>#include<queue>using namespace std;int main(){ priority_queue<int,vector<i...原创 2019-04-20 16:55:27 · 472 阅读 · 0 评论 -
算法笔记9.6 并查集
9.6.1并查集的定义9.6.2 并查集的基本操作 总体来说,并查集的使用先要初始化,然后查找合并1.初始化开始所有元素是一个独立的集合,父节点都初始化为自己 即:father[i]=i//初始化for(int i=0;i<=N;i++){ father[i]=i;//father[i]=-1也行 此处习惯用i}2.查找由于规定一个集合只有一个...原创 2019-04-12 15:27:22 · 186 阅读 · 1 评论 -
算法笔记9.4 二叉查找树 (BST)
9.4.1 二叉查找树的定义定义结构:struct node{ int data; node *lchild,*rchild; };node* newNode(int x){ node* Node=new node; Node->data=x; Node->lchild=Node->rchild=NULL; return Node;}1...原创 2019-04-10 21:51:01 · 283 阅读 · 0 评论 -
codeup 9.3——数据结构专题(2)->树的遍历
问题 A: 树查找时间限制:1 Sec内存限制:32 MB提交:238解决:135[提交][状态][讨论版][命题人:外部导入]题目描述有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。输入输入有多组数据。每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。输...原创 2019-04-10 17:42:43 · 239 阅读 · 0 评论 -
算法笔记9.3 树的遍历
本节讨论一般意义上的树,即子结点个数不限且子结点没有先后次序的树9.3.1 树的静态写法(孩子结点不定,普通的树一般都使用静态写法)1.树的存储结构//树的存储结构struct node{ Type data;//数据域 vector<int> child;//指针域,存放所有子结点的下标 孩子结点个数不定用vector}Node[maxn];2.新...原创 2019-04-10 15:18:01 · 191 阅读 · 0 评论 -
算法笔记9.2 二叉树的遍历 及 中序分别与先序、后序、层序搭配构建二叉树
目录9.2.1先序遍历9.2.2 中序遍历9.2.3后序遍历9.2.4层序遍历9.2.5根据先序中序序列,建立二叉树 变式.根据后序中序序列还原二叉树 变式:根据层序中序序列还原二叉树9.2.6二叉树的静态实现二叉树的遍历共四种:先序遍历、中序遍历、后序遍历、层次遍历前三种: 采用深度优先搜索(DFS)实现递归层次...原创 2019-04-05 18:27:34 · 490 阅读 · 0 评论 -
算法笔记11.8 DP总结
经典DP模型总结:(1)最大连续子序列和 令dp[i]表示以A[i]作为末尾的连续序列的最大和(2)最长不降子序列 令dp[i]表示以A[i]结尾的最长不下降子序列长度(3)最长公共子序列(LCS) 令dp[i][j]表示字符串A的i号位和字符串B的j号位之前的LCS长度(4)最长回文子串 令dp[i][j]表示S[i]至S[j]所表示的子串是否是回文子串(5...原创 2019-03-30 21:04:56 · 195 阅读 · 0 评论 -
算法笔记 11.7 背包问题
01背包问题: 有n件物品,每件物品的重量为w[i],价值为c[i]。现在有一个容量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。其中每种物品都只有1件。样例:5 8 //n=5 V=8 5件物品 8大的包3 5 1 2 2 //w[i] 每件物品的重量 w[i]之和有上限4 5 2 1 3 //c[i] 每件物品的价值 要求价值之和尽可能大 求最...原创 2019-03-23 19:30:05 · 396 阅读 · 0 评论 -
算法笔记6.2 set
set:内部自动有序且不含重复元素的容器set<int> se;set<int>::iterator it;不支持*(it+1) //除了vector和string外都不支持 也就只有string和vector可以向数组那样[index]下标访问se.insert(1);//插入数字1se.find(1);//查找元素值为1元素返回该值地址 未找到...原创 2019-03-07 17:08:39 · 279 阅读 · 0 评论 -
算法笔记8.1 深度优先搜索 DFS
1.背包问题切入dfs,深度优先,递归找出所有路径(拿法),最终取最大的那个 有n件物品,每种物品的重量为w[i],价值为c[i].现在需要选出若干件物品放入一个容量为V的背包中,使得在选入背包的物品重量和不超过容量V的前提下,让背包中物品的价值之和最大,求最大价值。(1<=n<=20)#include<iostream>using namespace...原创 2019-03-14 21:17:41 · 430 阅读 · 0 评论 -
算法笔记5.1 最大公约数与最小公倍数
输入正整数m,n,求m,n的最大公约数和最小公倍数(最简洁写法)#include<iostream> using namespace std;//辗转相除法求最大公约数int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a%b);}//最小公倍数int lcm(int a,int b){ ...原创 2019-02-27 20:33:08 · 520 阅读 · 0 评论 -
图的遍历 DFS(深度优先)
总结伪代码:void DFS(u){ vis[u]=true;//设置u已经被访问 for(从u出发能到达的所有顶点v){//枚举从u出发可以到达的所有顶点v if(vis[v]==false){//若v未被访问 DFS(v);//递归访问v } } }void DFSTrave(G){//遍历图 for(G的所有顶点u){//对G的所有顶点u if(vis[...原创 2018-12-08 22:04:41 · 1053 阅读 · 0 评论 -
最小公倍数lcm和最大公约数gcd
递归求最大公约数(辗转相除法|欧几里得算法)//最大公约数int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b);}//最大公约数 简洁写法int gcd(int a,int b){ return !b?a:gcd(b,a%b);} 然后 a,b的最大公约数=(a*b)/(a,b的最小...原创 2018-11-26 23:16:35 · 352 阅读 · 0 评论 -
算法笔记3.6 字符串处理 PAT例题
1009 说反话 (20 分)给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。输出格式:每个测试用例的输出占一行,输出倒序后的句子。输入样例:...原创 2018-09-30 19:31:37 · 187 阅读 · 0 评论 -
算法笔记 pat 3.5 D进制的A+B
1022D进制的A+B(20 分)输入两个非负 10 进制整数A和B(≤230−1),输出A+B的D(1<D≤10)进制数。输入格式:输入在一行中依次给出 3 个整数A、B和D。输出格式:输出A+B的D进制数。输入样例:123 456 8输出样例:1103注意结果为0时 建议每次都要测试一下边界值...原创 2018-09-29 23:24:32 · 197 阅读 · 1 评论 -
算法笔记 4.4 贪心 区间贪心
贪心分治动规区别1.简单贪心PAT B1020 月饼PAT B1023 组个最小数2.区间贪心给出N个开区间(x,y),从中选择尽可能多的开区间,使得这些开区间两两之间没有交集例如:(1,3)、(2,4)、(3,5)、(6,7) 最多选3个:(1,3),(3,5)、(6,7)贪心算法思想:基础两点:a.优先选择短的区间b.如果存在一个区间包含另一个区间,应选择更小...原创 2018-10-06 17:29:50 · 1014 阅读 · 0 评论 -
算法笔记 PAT B1023 组个最小数
1023 组个最小数 (20 分)给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。现给定数字,请编写程序输出能够组成的最小的数。输入格式:输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、...原创 2018-10-06 16:15:01 · 268 阅读 · 0 评论 -
算法笔记 PAT B1020 月饼
1020 月饼 (25 分)月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨...原创 2018-10-06 15:35:21 · 325 阅读 · 2 评论 -
算法笔记 4.3 递归 例题 全排列与八皇后
1.全排列问题描述:输入一个正整数n,输出1~n的全排列代码:#include<iostream> using namespace std;const int maxn=11;int n,P[maxn],hashTable[maxn]={false};void generateP(int index){ if(index==n+1){//递归边界,已经处...原创 2018-10-04 18:21:58 · 496 阅读 · 0 评论 -
算法笔记 4.2 散列 字符串hash初步 例题
题目:输入M:接下来输入M个字符串输入N:接下来输入N个字符串求N个字符串分别在M个字符串中出现的次数字符串均为小写字母组成 长度不超过4要求:不准遍历,每次查找时间复杂度O(1)分析:字符串hash初步 转换为n进制数(字符串字符种类个数为n),肯定能唯一表示代码:#include<iostream>#include <string>usi...原创 2018-10-03 23:55:11 · 487 阅读 · 0 评论 -
算法笔记 4.1 PAT A1025
1025 PAT Ranking (25 分)Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several pl...原创 2018-10-03 20:55:18 · 264 阅读 · 0 评论