自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 树递归遍历的本质

树的遍历分为前序中序后序,这三种遍历的本质是什么呢?其实不管哪种遍历方式遍历的路径都是一样的,为什么结果不一样,就在于是第几次遍历的时候输出。下面我们来看一下遍历的图。 如上图可以看出每一个节点都会经过三次,就像一个邮递员在寄信的时候,可以选择是第一次经过你家的时候给你投信还是回来再经过你家的时候给你投信。第一次经过一个节点的时候就输出就是前序遍历,第二次经过的时候输出就是中序遍历,最后一次经过的时候输出就是后序遍历。这就是遍历的本质。 ...

2020-06-30 18:54:36 338

原创 北航计算机2015年考研机试题

第一题 如果对于两个大于 1 的正整数 x 和 y,x 除了本身以外的因子之和等于 y,y 除了本身以外的 因子之和等于 x,则称 x 和 y 是一对相亲数。比如 220 除了本身以外的因子之和 110+55+44+22+20+11+10+5+4+2+1=284,而 284 除了 本身以外的因子之和 142+71+4+2+1=220,则 220 和 284 就是一对相亲数。 请你编写一个程序计算 x 和 y 分别除了本身以外的因子之和,并判断 x 和 y 是不是一对相亲数。x 和 y 为大于 1 的 int

2020-06-25 00:11:25 401

原创 北航计算机2016年考研机试题

第一题 给定一个数n,将这个数的各位顺序颠倒,称为逆序数m。 例如1234的逆序数是4321。 输入一个数n(0 < n<1000000000),已知输入开头不包含多余的0。 输出结果:如果m是n的k倍(k为整数),那么输出n*k=m。 如果m不是n的整数倍,那么输出n和n的逆序数。… 样例输入 : 1234 1089 23200 样例输出 : 1234 4321 1089*9=9801 23200 00232 #include<bits/stdc++.h> using namesp

2020-06-25 00:03:28 301

原创 链表中倒数第K的节点 双指针

输入一个链表,输出该链表中倒数第k个节点。 常规思路:一个指针先遍历一趟求出链表长度n。然后再用指针从头节点出发遍历n-k+1步到达倒数第k个节点。 Tips:双指针并不是固定的公式,而是一种思维方式~ 使用双指针,设有两个指针p,q,初始时指向头节点。首先让p沿着next指针移动k次,此时,p 指向第 k+1个结点,q 指向头节点,两个指针的距离为k,然后同时移动指针p,q(移动过程中两指针距离一直为k)直到p指向空,此时q指针指向链表中倒数第k个节点。 ListNode* getKthFromE

2020-06-22 13:54:48 267

原创 环形链表 LeetCode

题意:给定一个链表,判断链表中是否有环。 思路一:使用哈希表记录访问次数,如果链表节点重复访问则链表中有环。 bool hasCycle(ListNode *head) { unordered_map<ListNode*,int>mp; ListNode *p=head; while(p!=NULL){ if(mp.find(p)==mp.end()){ mp[p]=1; //初

2020-06-22 12:59:40 166

原创 迪杰斯特拉模板(记录最短路径)

#include<iostream> #include<cstring> #include<algorithm> #include<vector> using namespace std; ///每次将最近的距离点u加入到集合中,然后用点u去更新未访问的邻接点v到原点的最短路径距离. ///s->...->u->v 因此u是v的前继结点。保存最短路径时用pre[v]=u,表示v的前继结点 const int maxn=10010,inf=0x

2020-06-21 23:05:01 295

原创 多重部分和问题 动态规划

有n种不同大小的数字a[i],每种各m[i]个。判断是否可以从这些数学中选出若干使他们的和恰好为K. 这个问题可以用动态规划求解,不过如何定义递推关系会影响最终的复杂度。 定义:dp[i+1][j]:=用前i中数字是否能加和成j。 (能加成则为1,不能为0) (1)能加成数字j,那么第i个数字可能需要K个(k=0、1、…、m[i]) dp[i][j]=dp[i][j-k*a[i]]=1; (2)不能加成数字j. dp[i][j]=0 #include<iostream> #include&lt

2020-06-21 17:40:13 311

原创 最长回文子串 动态规划

给出一个字符串S,求S的最长回文子串的长度。 样例输入:PATZJUJZTACCBCC 输出:9 寻找二维动态规划表达式dp[i][j],如果直接用dp[i][j]表示子符串从S[i]到S[j]的最长回文子串长度无法得出递推表达式。 令dp[i][j]表示S[i]至S[j]所表示的子串是否是回文子串,是则为1,不是为0; if(s[i]==s[j]) dp[i][j]=sp[i-1][j-1]; if(s[i]!=s[j]) dp[i][j]=0; #include<iostream> #in

2020-06-20 22:39:30 222

原创 动态规划详解 数塔问题

下图是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大. (f[i][j]表示数塔所在位置的数字) 1.用动态规划方法解决的问题有两个特征: (1)重叠子问题:如果一个问题可以被分解为若干个子问题,且这些子问题重复出现,那么称这个问题拥有重叠子问题。 (2)最优子结构:一个问题的最优解可以由其子问题的最优解有效的构造出来。 动态规划将一个复杂的问题分解为若干个子问题,通过综合子问题的最优解来得到原问题的最优解。需要注意的是动态规划会将每个求解

2020-06-20 08:02:28 3648

原创 二分图染色模板

判定一个图是否为二分图 从其中一个定点开始,将跟它邻接的点染成与其不同的颜色,最后如果邻接的点有相同颜色,则说明不是二分图,每次用bfs或者bfs遍历即可。 dfs模板 bool dfs(int u,int c){ color[u]=c; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(color[v]==c) return false; if(color[v]==0&&

2020-06-17 20:10:31 314

原创 石子合并 区间动态规划

设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=300)。每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆,每次只能合并相邻的两堆,合并的代价为这两堆沙子的数量之和,合并后与这两堆沙子相邻的沙子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。(如有4堆沙子分别为 1 3 5 2 我们可以先合并1、2堆,代价为4,得到4 5 2 又合并 1,2堆,代价为9,得到9 2 ,再合并得到11,总代价为4+9+11=24,如果第二步是先合并2,3堆,则代价为

2020-06-11 14:19:29 552

原创 LeetCode96不同的二叉搜索树 动态规划

难度中等542给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?

2020-06-10 20:45:56 188

原创 LeetCode连续子数组的最大和 动态规划

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 (1 <= arr.length <= 10^5,-100 <= arr[i] <= 100) 思路1:记录前缀和思想求一段连续的子数组的最大值,即任意区间【i,j】和的最大值,可以先记录前缀和。用sum[

2020-06-08 21:10:16 466

原创 用优先队列构造哈夫曼树

1.优先队列priority_queue,底层是用堆实现的,队首元素一定是当前队列中优先级最高的那一个。优先级设置有两种方式,priorty_queueq 或者 priority_queue<int,vector,less>,第二个参数是来承载底层数据结构堆的容器。less表示数字大的优先级大,greater表示数字小的优先级大。 2.哈夫曼树合并结点时每次选取权重最小的两个结点进行合并。将结点保存到优先队列中,降序排列,每次取出队列中前两个权重值低的结点。合并结点后再压入队列中。 3.优先队列

2020-06-06 18:46:22 1085

原创 Tarjan算法通俗理解

Tarjan算法是基于对图深度优先搜索的算法,时间复杂度是O( | V |+| E | )。 介绍Tarjan算法前解释下搜索树,有向图的搜索树主要有四种边。用虚线画出来的是树边,每次搜索找到一个还没有访问过的结点是时候就形成了一条树边。用长虚线画出来的边是反祖边,也称做回边。用短虚线画出来的是横叉边,它主要是在搜索时遇到了一个已经访问过的结点,但是这个结点并不是当前节点的祖先形成的(例如结点4到3,结点6到4)。另外,像结点1到6不是直接到达的边称为前向边。 input:(输入6个顶点,8条边) 6

2020-06-03 17:32:56 677

原创 2017年北航计算机考研机试题

1.求中位数的位置 先输入一个整形数字N,接着输入N个无序的数字。要求输出升序排列后的中位数,以及该中位数输入的次序。如果N为偶数,则有两个中位数,每行输出中位数和数字输入时的次序。如果N为奇数,输出最中间的数和其输入时的次序即可(空格隔开)。 #include<bits/stdc++.h> using namespace std; struct node{ int a; int id; }; vector<node>v; bool cmp(node a,node b

2020-06-01 23:51:29 456 1

原创 中缀转后缀表达式

1.遇到操作数: 添加到后缀表达式中 2.运算符栈空时:遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,输出到后缀表达式,直到弹出的是左括号。(括号不输出到后缀表达式) 5.遇到其他运算符:弹出所有优先级>=该运算符的栈顶元素,然后将该运算符入栈。 6.将栈中剩余内容依次弹出后缀表达式 (需要设定优先级,括号的优先级最低,因为只有右括号才能使左括号从运算符栈中弹出) 注: (1)为什么当op运算符高于栈顶元素优先级时就压入操作符栈。例如1+23:在后缀表达式中乘号必须在加

2020-05-31 23:34:01 194

原创 求n的阶乘

当n较大时,n的阶乘无法用int型数字表示,可以用数组f记录阶乘结果的每一位,从结果的低位开始存储。 f[0]表示结果的个位,f[1]表示十位,f[2]表示百位… #include<bits/stdc++.h> using namespace std; const int maxn=1000000; int f[maxn]; int main() { int i,j,n; cin>>n; memset(f,0,sizeof(f)); f[0]=1;

2020-05-31 18:36:52 2328

原创 小学生算术求进位次数

题意:计算两个整数相加时需要多少次进位。程序可以连续处理多组数据,直到读到两个0结束。(输入的整数都不超过9个数字) 输入: 123 456 555 555 123 594 输出: 0 3 1 分析:输入的数字不超过9个数字,可以用int表示。每次把a和b分别模10得到个位数。 #include<bits/stdc++.h> using namespace std; int main() { int a,b; while(cin>>a>>b&&am

2020-05-31 18:27:42 1203

原创 使用stringstream和getline()函数分割字符串

1.getline函数用于读取整行字符串。 getline()的原型是istream& getline ( istream &is , string &str , char delim ); 参数解释: (1)istream &is 表示一个输入流,例如cin; (2)string&str表示把从输入流读入的字符串存放在这个字符串str中; (3)char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’,因此getline函数遇到换行符会

2020-05-28 11:12:09 1440

原创 使用getline函数的注意事项

1.getline函数用于读取整行字符串。 getline()的原型是istream& getline ( istream &is , string &str , char delim ); 参数解释: (1)istream &is 表示一个输入流,例如cin; (2)string&str表示把从输入流读入的字符串存放在这个字符串str中; (3)char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’,也就是回车换行符(遇到回车停止读入

2020-05-28 10:54:42 1630

原创 C++ Map容器初始化遇到的问题

例如:创建一个map容器: map<int,int>mp; //初始化 mp[1]=3; mp[2]=5; //此时mp容器的长度为2 mp[3]; //执行此语句也会给mp容器分配一个值为3的键,此时mp长度为3 //所以如果不确定mp中是否有该键值对而直接使用,会造成此键值对被初始化到mp中 例子二: map<string,vector<int> >p; string s="123"; p[s].push_back(3); ///这样会

2020-05-20 16:03:57 1669

原创 动态规划-矩阵连乘

题意:多个矩阵连乘,矩阵相乘的顺序不同,计算的次数也不同。 分析:矩阵连乘AiAi+1Ai+2……Aj的最优解问题。 1.假设在第k位置上找到最优解,则问题变成了两个子问题:(AiAi+1……Ak),(Ak+1……Aj)因此矩阵连乘划分括号有最优子结构可以使用动态规划 2.定义表达式:m[i][j]表示矩阵Ai到矩阵Aj连乘计算所需的最小次数。 m[i][j]=m[i][k]+m[k][j]+p[...

2020-04-29 21:55:31 393

原创 第十一届蓝桥杯省赛模拟赛C/C++题解

给定一个单词,请使用凯撒密码将这个单词加密。 凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变为d,b变为e,…,w变为z,x变为a,y变为b,z变为c。 例如,lanqiao会变成odqtldr。 输入格式 输入一行,包含一个单词,单词中只包含小写英文字母。 输出格式 输出一行,表示加密后的密文。 样例输入 lanqiao 样例输出 odqtldr 评测用例规模与约定 对于所有评测用例,单词中的字母个数不超过100。

2020-04-25 23:42:18 983

空空如也

空空如也

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

TA关注的人

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