算法
不要绝望总会慢慢变强
当你觉得整个世界都放弃了你,还有那几行代码值得你珍重!
展开
-
矩阵连乘问题
动态规划例1 矩阵连乘问题引入例如矩阵连乘积A1A2A3A4A_1A_2A_3A_4A1A2A3A4可以有下列5中完全加括号的方式:(A1(A2(A3A4)),(A1(A2A3)A4),((A1A2)(A3A4)),((A1(A2A3))A4),(((A1A2)A3)A4)(A_1(A_2(A_3A_4)), (A_1(A_2A_3)A_4) , ((A_1A_2)(A_3A_4)) , ((A_1(A_2A_3))A_4) , (((A_1A_2)A_3)A_4)(A1(A原创 2020-09-26 18:04:26 · 1304 阅读 · 0 评论 -
斐波那契数列
1.非递归版class Solution: def Fibonacci(self, n): if n==0: return 0 if n==1: return 1 a = 0 b = 1 i=1 while(i<n): ...原创 2020-04-25 18:13:17 · 153 阅读 · 0 评论 -
KMP算法
今天看数据结KMP算法有点懵,特此记录一下1.kmp算法相对于暴力字符串匹配的优点?===时间复杂度O(m+n)如上图所示,当C和D不匹配时,KMP算法不会像暴力破解(移动下边的A和上边的B匹配),而是保持上边个字符串不动,仅仅移动下边个字符串(称为模式串)如下图:这种方法大大节省了匹配次数,提高了效率,但是kmp怎么知道怎么移动呢?这就是next数组的功劳2.求next数...原创 2020-04-12 14:56:10 · 118 阅读 · 0 评论 -
OJ三种循环输入
1.第一种输入:21 54 8输出:612//代码#include<vector> using namespace std;int main(){ int t = 3; while(t--) { int a,b; cin>>a>>b; cout<<a...原创 2020-03-10 16:17:13 · 630 阅读 · 1 评论 -
选择排序
------------选择排序思想:每一轮选择最小的放在左边最好情况:O(n2)最坏情况:O(n2)(选出的a[0]为最大或者最小元素)平均:O(n2)稳定性:非稳定排序仅适用于顺序表,链表代码:#include<stdio.h>int a[] = {2,100,15,25,99,44,24,56};void swap(int &a,...原创 2019-11-09 11:11:02 · 285 阅读 · 0 评论 -
冒泡排序
冒泡排序是一种稳定的排序,时间复杂度O(n2)public class Main {//冒泡排序的思想是相邻元素比较然后将最大的冒到右边去,经过n-1轮结束 public static void main(String[] args) { int []a = {2,100,15,25,99,44,24,56}; for(int i = 0;i<...原创 2019-11-08 23:26:52 · 122 阅读 · 0 评论 -
PAT A1087 All Roads Lead to Rome(30 分)----最短路径(加筛选条件)
总结:1.图中的点名称为字母,所以用两个map来进行转换2.先求最短路径集合,再求符合要求的最短路径代码:#include<iostream>#include<vector>#include<map>#include<string>using namespace std;int weight[500];int vi[500...原创 2018-08-31 18:43:56 · 313 阅读 · 0 评论 -
PAT A1072 Gas Station(30 分)-------图最短路径---比较难点的题
总结:1.这道题用了dijstra算法,关键是开始对G1非数字的处理即Gi处理成i+n;我最后一个测试点开始没过就是因为用s.size()判断输入为数字还是G2,但是其实数据n+m是大于99的代码:#include<iostream>#include<algorithm>#include<vector>#include<string&g...原创 2018-08-31 16:54:19 · 1051 阅读 · 0 评论 -
PAT A1013 Battle Over Cities(25 分)---图1---求最大连通子图数量
总结:1.关于图的题可能会超时,优先选printf和scanf,优先选邻接表存储代码:#include<iostream>#include<vector>#include<algorithm>using namespace std;int repair = 0;vector<vector<int> >pp;int...原创 2018-08-28 19:11:29 · 404 阅读 · 0 评论 -
PAT A1053 Path of Equal Weight(30 分)-----树---dfs必看经典题目(attetion)
总结:1.这道题不难,但是是我在pat中遇到的关于树遍历题目相对比较复杂的题目之一了,给我的感觉和图相似,当然图更难。这道题有权,还要求规定sum的路径,还不止一条。2.我的解决办法是用dfs加了sum(从根到叶权之和,以及一个vector参数,用来记录从根到叶都经过了哪些节点),用了map来记录不同sum的路径3.sort()自定义排序过程中遇到了一个问题:[C++] Express...原创 2018-08-24 14:58:50 · 174 阅读 · 0 评论 -
PAT A1030 Travel Plan(30 分)
总结:1.常规套路,关键想想怎么存储图,然后就easy了代码:#include<iostream>#include<vector>#include<map>using namespace std;int vi[600];struct road{ int st; int end; int cost; int d...原创 2018-08-31 13:39:53 · 112 阅读 · 0 评论 -
各种排序总结
冒泡排序:https://blog.csdn.net/luoshiyong123/article/details/102981691快速排序:https://blog.csdn.net/luoshiyong123/article/details/80667676选择排序:https://blog.csdn.net/luoshiyong123/article/details/102984...原创 2018-08-28 17:04:07 · 728 阅读 · 0 评论 -
PAT A1098 Insertion or Heap Sort(25 分)------堆排序(attention)
总结:这道题始终有一个测试点过不去,是因为插入排序如 序列s为:1 3 5 7 7 2 0,这个序列前边5个都是有序的。所以第一个无序元素的时候while(s[i]<=s[i+1])有等号。。。。1.这道题考的是给定一个序列,让你判断是堆排序还是插入排序,对于插入排序,前边为有序队列,后边为无序队列,只要找到有序队列旁边第一个无序数,就可以用sort排序,而对于堆排序,先构建最大堆,...原创 2018-08-28 16:24:16 · 620 阅读 · 1 评论 -
PAT A1094 The Largest Generation(25 分)----树dfs求最大同层孩子树
代码:#include<iostream>#include<vector>#include<map>using namespace std;int m, n;int level, maxn;map<int, int>sk;vector<vector<int> >pp;void dfs(int inde...原创 2018-08-23 20:40:14 · 111 阅读 · 0 评论 -
PAT A1107 Social Clusters(30 分)-----------并查集1
参考:https://blog.csdn.net/a664607530/article/details/73991827总结:1.并查集查找是否在一个根节点下find函数,这道题用f数组保存根节点,如果这个是最终根节点f[i]=-1,如果不是f[i]就是当前i的父亲节点,via[i]表示i爱好的父亲节点,cnt[i]表示-----每一个最终根节点有多少个叶节点代码:#include...翻译 2018-08-26 21:30:03 · 156 阅读 · 0 评论 -
PAT A1043 Is It a Binary Search Tree(25 分)-----------二叉搜索树与二叉镜像搜索树----必看!
再次申明:本博客仅供个人pat复习之用,某些方法借鉴于某某博客开头会申明本题解答来源:https://www.liuchuo.net/archives/2153总结:这段代码的精妙之处在于以下几个方面:1.按常规出发:判断是否是二叉搜索树--》判断是否是镜像二叉搜索树-》是的话分别求后续遍历否的话--》cout<<"NO";该代码首先假定为二叉搜索树---》在假...翻译 2018-08-24 21:09:17 · 210 阅读 · 0 评论 -
PAT A1064 Complete Binary Search Tree(30 分)--------------完全二叉搜索树----复习+1
总结:1.给定一组树,我们可以确定一棵完全二叉搜索树,其中的大小关系按从小到大就和中序遍历一样,最先被遍历到的元素最小。代码:#include<iostream>#include<vector>#include<queue>#include<algorithm>using namespace std;vector<int&...原创 2018-08-25 00:36:17 · 145 阅读 · 0 评论 -
PAT A1021 Deepest Root(25 分)------图2---求最大联通子图和最大深度的节点集合(看)
总结:1.这道题算是相对比较麻烦的一道题,开始题意没读懂,A graph which is connected and acyclic can be considered a tree.开始没明白他说的这个树是什么,被acyclic误导了,以为不能出现三角形这种循环的图,结果是大于2个最大连通子图都不是树2.这道题的麻烦之处在于先要看该图是不是只有一个最大连通子图,如果是则要求最大深度的节点...原创 2018-08-29 08:58:02 · 529 阅读 · 0 评论 -
PAT A1111 Online Map(30 分)----最短路径麻烦题
总结:最后一个测试点超时。。1.这道题因为两个要求,同时求的话要互不影响才行,就像求最短路径的时候不能更新时间(重新设置个变量更新)2.以求最快路径为例,当totalen<minlen一定要更新totalsize,否则结果可能出错3.这种题优先采用dijstra方法代码:#include<iostream>#include<vector>#in...原创 2018-09-01 20:27:50 · 653 阅读 · 0 评论 -
PAT A1108 Finding Average(20 分)
总结:1.最坑的就是 printf("The average of %d number is %.2f", pp.size(), ps);当只有一个合法数字的时候输出number2.代码:#include<iostream>#include<vector>#include<string>using namespace std;vector...原创 2018-09-01 18:20:38 · 165 阅读 · 0 评论 -
PAT A1109 Group Photo(25 分)
1.这道题初看题意复杂,其实很简单的排序问题。2.要注意用vector的时候一定不要多给,少给了会vector out of ....,但多给了不容易看出来,要多少给多少,我就是因为多给了导致排序出来得结果有两个空node代码:#include<iostream>#include<vector>#include<string>#include&...原创 2018-09-01 17:55:20 · 266 阅读 · 0 评论 -
PAT A1110 Complete Binary Tree(25 分)----判断是否完全二叉树
总结:1.这道题很简单,但是我第一次只得了18/25.做简单题的时候一定要细心。2.当表示没有孩子的时候用-,所以开始很自然的想到用char读取,但是注意孩子的序号完全可能为两位数,11,12.所以用string读取。代码:#include<iostream>#include<vector>#include<map>#include<...原创 2018-09-01 17:51:48 · 405 阅读 · 9 评论 -
PAT A1003 Emergency(25 分)----最短路径
总结:这道题坑的地方在于求最大集结救援队是值得一条最短路线上的所有节点之和,而不是所有最短路径上的节点之和深搜(dfs):1.求路径,点权,边权。遍历,最大连通子图。2.两段代码分别使用深搜和dijkstra算法解决的,有兴趣可以两端都看看,第二段代码比第一段快,递归程序消耗大。dijkstra算法相当于非递归版的广度搜索。代码:#include<iostream&...原创 2018-08-29 23:32:49 · 437 阅读 · 2 评论 -
PAT A1066 Root of AVL Tree(25 分)------AVL树的调整------很精彩(attention)
总结:----第一次写---妄图用数组来完成--事实证明是不现实的。。。。。本代码参考:https://www.liuchuo.net/archives/2178总结第一次失败的教训:1.没有理解好rotate的精髓,用数组麻烦得多2.整体代码结构不是特别清晰,通过ac这道题,让我加深了对avl树的理解,以及对树整章的理解。3.这代码难点主要是对插入后的判断和调整,判断主要...原创 2018-08-25 20:08:49 · 231 阅读 · 0 评论 -
PAT A1018 Public Bike Management(30 分)
总结:该代码有两个测试点没过,因为没有考虑0->2>3>1(2,3,1权值分别为:54,0,78),最大容量为100,这种情况需要send46辆,剩18,而不是send18,剩01.这道题考察了dfs,最短路径问题,加上了送出的车最少和拿回的车最少,主要是自己之前理解出错,导致第一次没通过,第二次的代码是分开做的便于理解代码1;#include<iostr...原创 2018-08-29 19:15:58 · 484 阅读 · 0 评论 -
PAT A1099 Build A Binary Search Tree(30 分)----二叉搜索树(非完全)--求层次遍历
总结:1.感觉挺简单的,只要思路清晰,写一遍就全ac了,这种题再给我来一打哈哈哈哈2.掌握层次遍历利用队列----左子树先进队,右子树后进队,主要考察怎么表示一棵树!!代码:#include<iostream>#include<queue>#include<algorithm>#include<vector>using nam...原创 2018-08-25 14:37:18 · 197 阅读 · 0 评论 -
PAT A1034 Head of a Gang(30 分)---图3---图的遍历---求符合条件的最大连通子图(序号用字母代替)
总结:1.涉及到图的时候一定要考虑a和b,b和c,那么a和c也有联系2.就是把1 2 3 4 5 换成A B C D E问题就复杂好多3.读题!!!!代码#include<iostream>#include<vector>#include<map>#include<algorithm>#include<string&...原创 2018-08-29 15:38:41 · 173 阅读 · 0 评论 -
PAT A1024 Palindromic Number (25)----字符串操作注意
Conclusion:1.进位不仅仅加在两个数相加的时候,计算当前位向上进位也要考虑上一位的进位!!!!代码:#include<iostream>#include<string>using namespace std;bool isRT(string s){ for (int i = 0, j = s.length() - 1; i < j...原创 2018-08-08 10:06:23 · 160 阅读 · 0 评论 -
百练4115(鸣人和佐助)
#include<iostream>#include<algorithm>#include<queue>#include<cstdlib>#include<cstring>using namespace std;int M, N, T;int flag = 0;int aa, bb;char migong[210][2...原创 2018-06-23 23:38:02 · 349 阅读 · 0 评论 -
poj1222
#include<iostream>#include<cstring>#include<memory>#include<string>using namespace std;char orI[5];char lights[5];char result[5];int getbit(char c, int i){ return (c >>...转载 2018-06-01 21:07:26 · 243 阅读 · 0 评论 -
poj3984
#include<iostream>#include<queue>#include<stack>#include<cstdlib>#include<cstring>int g = 0;using namespace std;int maze[5][5];int visited[30];struct node{ int x; i...原创 2018-06-23 16:06:56 · 328 阅读 · 0 评论 -
汉诺塔问题
汉诺塔问题是个经典的递归,我把我的观点分享一下我们的目标是把a上的n个盘子移动到c,假设这里有一个move(n,a,b,c)函数能实现将n个盘子从a移动到c那我们只需要三步1.调用这个函数将上边n-1个盘子移动到b,即move(n-1,a,c,b)2.调用这个函数将第n个圆盘从a移动到c即move(1,a,b,c)3.调用这个函数将b上的n-1个圆盘从b移动到c即move(n-1,b,a,c)即可...原创 2018-06-01 16:20:26 · 160 阅读 · 0 评论 -
poj3278
#include<iostream>#include<cstdlib>#include<queue>#include<cstring>using namespace std;int v, e;int visited[100010];struct node{ int x; int mintime; node(i...原创 2018-06-22 21:52:36 · 155 阅读 · 0 评论 -
poj1724(dfs)
#include<iostream>#include<vector>#include<cstring>#include<algorithm>using namespace std;struct road{ int d; int L; int t;};vector< vector<road> ...原创 2018-06-22 00:05:04 · 323 阅读 · 0 评论 -
快速排序
------------快速排序思想:快排的思想是找一个数(通常找第一个a[0]),将数组分为比a[0]大的部分和a[0]小的部分,然后将前边部分和后边部分看成新数组,分别递归。最好情况:O(log2n)最坏情况:O(n2)(选出的a[0]为最大或者最小元素)平均:O(log2n)稳定性:非稳定排序仅适用于顺序表,不适用于链表代码:#include<iost...原创 2018-06-12 16:46:32 · 203 阅读 · 0 评论 -
二路归并排序
------------二路归并排序思想:分治,将每一个无序数组分为两个数组,分别把这两个数组排序然后再合起来就是一个有序数组,运用了递归思想最好情况:O(nlgn)最坏情况:O(nlgn)(选出的a[0]为最大或者最小元素)平均:O(nlgn)空间复杂度:O(n)稳定性:稳定排序仅适用于顺序表,可用作外部排序中#include<iostream>...原创 2018-06-12 16:09:51 · 265 阅读 · 0 评论 -
括号匹配(南阳oj)
#include<iostream>#include<string>#include<cmath>using namespace std;int main(){ char stack[10000]; char k[10000]; int num = -1; int m = 0; int n = -1; ...原创 2018-06-04 21:19:35 · 403 阅读 · 0 评论 -
常见排序(一)
主函数int main(){ int a[] = {100, 5, 3, 1, 8, 7, 2, 4}; int n = sizeof(a)/sizeof(int); cout << "原数组为:"; for (int i = 0; i < n; i++) cout << a[i]; //Bubbleso...原创 2018-05-22 22:52:03 · 129 阅读 · 0 评论 -
PEKING1013
#include<iostream>#include<cstring>using namespace std;char Left[3][7];char Right[3][7];char result[3][7];bool IsFake(char c,bool light);int main(){ int t; cin>>t; while(t...原创 2018-04-05 11:45:56 · 124 阅读 · 0 评论 -
链表理解
#include<iostream>using namespace std;typedef struct node{ int data; struct node *link;}Lnode,*Linklist;Linklist creat(int n){ Linklist p,list = NULL; Linklist r = NULL; ...原创 2018-05-05 00:51:24 · 323 阅读 · 0 评论