
算法笔记
文章平均质量分 61
读书笔记
MojitO_o
这个作者很懒,什么都没留下…
展开
-
【算法笔记】树的遍历 |【PAT A1053】Path of Equal Weight
【算法笔记】树的遍历树的静态写法树的先根遍历树的层序遍历从树的遍历看DFS与BFS【PAT A1053】Path of Equal Weight思路代码树的静态写法在二叉树中,由数据域和指针域组成,左指针指向左子树根结点的地址,右指针指向右子树根结点的地址。对一棵一般意义的树来说,仍然可以保留数据域,而令指针域存放其所有子结点的地址(或者为其开一个数组,存放所有子结点的地址)。但还是建议使用静态方法,用数组下标存放地址。需要事先开一个大小不低于结点上限个数的结点数组:struct node{ typ原创 2022-05-02 13:28:03 · 584 阅读 · 0 评论 -
【算法笔记】二叉树基本操作
【算法笔记】二叉树基本操作二叉树存储结构与基本操作二叉树结点的查找、修改二叉树结点的插入二叉树的创建完全二叉树的存储结构二叉树的遍历先序遍历中序遍历后序遍历层序遍历给定二叉树的先序遍历和中序遍历序列,重建这棵二叉树二叉树的静态实现[PAT A1020] Tree Traversals二叉树存储结构与基本操作二叉链表:struct node{ typename data; //数据域 node* lchild; //指向左子树根结点的指针 node* rchild; //指向右子树根结点的指针}原创 2022-04-28 17:32:44 · 1071 阅读 · 0 评论 -
【算法笔记】广度优先搜索BFS
【算法笔记】广度优先搜索BFS例题1思路代码例题2思路代码提示广度优先搜索一般由队列实现,且总是按层次的顺序进行遍历,基本写法如下:void BFS(int s){ queue<int> q; q.push(s); //定义一个队列q,并将起点s入队 //队列q非空 while(!q.empty()){ 取出队首元素top; 访问队首元素top; 将队首元素出队; 将top的下一层结点中未曾入队的结点全部入队,并设置为已入队; //标记层号为now的层号+1,同原创 2022-04-24 16:57:05 · 1867 阅读 · 0 评论 -
【算法笔记】深度优先搜索DFS
深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法。使用递归可以很好地实现深度优先搜索,非递归也可以实现dfs的思想,但一般情况下会比递归麻烦。递归时,系统会调用系统栈存放递归中每一层的状态。【一类常见dfs问题的解决方法:】给定一个序列,枚举这个序列的所有子序列(可以不连续)。枚举从n个整数中选择k个数的所有方案。例题给定N个整数(可能有负数),从中选择k个数,使得这k个数之和恰好等于一个给定的整数x;如果有多种方案,选择它们中元素平方和最大的一个。#include <stdi原创 2022-04-20 22:15:19 · 299 阅读 · 0 评论 -
【算法笔记】链表处理:PAT A1032 sharing | PAT A1052 Linked list sorting
【算法笔记】链表处理链表使用malloc函数或new运算符为链表结点分配内存空间malloc函数new运算符内存泄漏链表的基本操作创建链表查找元素插入元素链表链表由若干个结点组成,且结点在内存中的存储位置通常不连续。链表结点一般由两部分组成,数据域和指针域。struct node{ typename data; //数据域 node* next; //指针域};数据域存放结点要存储的数据,指针域指向下一个结点的地址,头结点head数据域data不存放任何内容,而指针域next指向第一个数原创 2022-04-19 13:04:28 · 1387 阅读 · 0 评论 -
【算法笔记】栈/队列 的应用-(codeup 1918)简单计算器
栈/队列 的应用-(codeup 1918)简单计算器栈栈的常见操作队列队列常见操作【codeup 1918】 简单计算器栈栈:后进先出的数据结构。栈顶指针:始终指向栈的最上方元素的一个标记。使用数组实现栈时,栈顶指针是一个int型变量(数组下标从零开始),记top;使用链表实现栈时,是一个int* 型指针。栈中没有元素,栈空时令top为-1。栈的常见操作清空 clear()栈顶指针置为-1void clear(){ TOP=-1;}获取栈内元素个数 size()top指针始原创 2022-04-17 20:45:17 · 1419 阅读 · 1 评论 -
algorithm头文件下的常用函数-学习笔记
#include < algorithm >using namespace std;max(x,y),min(x,y),abs(x)max和min返回x和y中的最大值和最小值,参数可以是浮点数。如果要返回三个数的最值,可以使用max(x,max(y,z))写法。abs(x)返回x的绝对值,x必须是整数,浮点数使用math头文件下的fabs。#include <stdio.h>#include <algorithm>using namespace std;i原创 2022-04-15 14:41:29 · 879 阅读 · 0 评论 -
pair-学习笔记
pair:可以看作一个内部有两个元素的结构体,且这两个元素的类型可以指定struct pair{ typeName1 first; typeName2 second;};pair的定义头文件:include <utility> using namespace std;map的内部实现中涉及pair,因此添加map头文件时会自动添加utility头文件。(可用map头文件代替utility头文件)pair<typeName1,typeName2> name;pai原创 2022-04-14 21:33:05 · 240 阅读 · 0 评论 -
priority_queue-学习笔记
priority_queue:优先队列,底层用堆来实现。优先队列中,队首元素一定是当前队列中优先级最高的那一个。priority_queue的定义头文件:#include < queue > using namespace std;priority_queue< typename > name;priority_queue容器内元素的访问与队列不同,优先队列没有front函数与back函数,只能通过top函数访问队首元素#include <stdio.h原创 2022-04-13 19:37:56 · 503 阅读 · 0 评论 -
queue-学习笔记
queue:队列,实现先进先出头文件:#include < queue> using namespace std;queue的定义queue< typename > name;queue容器内元素的访问STL中只能通过front( )来访问队首元素,通过back( )来访问队尾元素。#include <stdio.h>#include <queue>using namespace std;int main(){ queue<int原创 2022-04-13 18:35:08 · 182 阅读 · 0 评论 -
stack-学习笔记
stack:栈,是STL中实现的一个后进先出的容器stack定义头文件:#include <stack> using namespace std;stack< typename > name;stack容器内元素的访问stack本身是后进先出,只能通过top()访问栈顶元素。#include <stdio.h>#include <stack>using namespace std;int main(){ stack<int>原创 2022-04-14 20:55:21 · 409 阅读 · 0 评论 -
map-学习笔记
map:映射定义int型数组时,实际是定义了一个从int型到int型的映射,array[0]=25,就是将0映射到25;double型数组则是将int型映射到double型,如db[0]=3.14,db[1]=0.01。map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器),如string到int的映射。map头文件:#include < map> using namespace std;map定义map<typename1,typename2>原创 2022-04-13 18:16:08 · 494 阅读 · 0 评论 -
string用法-学习笔记
string类型,对字符串常用的需求功能进行了封装。头文件:#include < string > using namespace std;<string.h>=< cstring >是c的头文件,c语言标准库函数,是c处理c字符串的库函数< string >是c++字符串类头文件string的定义与基本数据类型相同:string str;//初始化string str='abcd';string中内容的访问通过下标访问可以直接像字符原创 2022-04-06 18:26:57 · 1003 阅读 · 0 评论 -
set用法-学习笔记
set,集合,内部自动有序且不含重复元素的容器。头文件:#include using namespace std;set定义单独定义一个set:set<typename> name; //typename可以是任意基本类型,也可以是STL标准容器,vector/set/queue等set<int> name;set<char> name;set<node> name; //node是结构体类型//set数组定义set<typena原创 2022-04-06 13:14:05 · 283 阅读 · 0 评论 -
vector用法-学习笔记
vector——变长数组,长度根据需要自动改变;还可以用来以邻接表的方式存储图。头文件:#include using namespace std;vector定义vector<typename> name; //相当于一维数组name[SIZE]vector<int> name;vector<double> name;vector<char> name;vector<node> name; //node是结构体的类型如果t原创 2022-04-06 09:05:36 · 550 阅读 · 0 评论 -
数学问题-学习笔记2
质因子分解将一个正整数n写成一个或多个质数的乘积的形式:6=23,8=22*2,···。或者写成指数的形式:6=21 *31,8=23 ···//定义结构体,存放质因子及其个数 struct factor{ int x,cnt; //x为质因子,cnt为其个数 }fac[10]; //如,180=2^2*3^2*5^1fac[0].x=2;fac[0].cnt=2;fac[1].x=3;fac[1].cnt=2;fac[2].x=5;fac[2].cnt=1;枚举1~sqr原创 2022-04-03 19:05:30 · 421 阅读 · 0 评论 -
数学问题-学习笔记
简单数学pat b1019 数字黑洞给定任一个各位数字不完全相同的四位正整数,如果先把四个数字按非递增排序,再按非递减排序,然后用第一个数字减第二个数字,得到一个新的数字。一直重复这样做,很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫kaprekar常数。如,从6767开始:7766-6677=10899810-0189=96219621-1269=83528532-2358=61747641-1467=6174···现给定任意四位正整数,请编写程序演示到达数字黑洞的过程。原创 2022-04-02 17:22:24 · 512 阅读 · 0 评论 -
一些高效技巧与算法-学习笔记
打表用空间换时间的技巧,一般指将所有可能需要用到的结果事先计算出来,这样后面需要用到时就可以直接查表获得。常见用法:1.在程序中一次性计算出所有需要用到的结果,之后的查询直接取这些结果这是最常用到的用法,在一个需要查询大量Fibonacci数F(n)的问题中,显然每次从头开始计算是非常耗时的,对q次查询会产生nq的时间复杂度;如果进行预处理,即把所有Fibonacci数预先计算并存在数组中,那么每次查询就只需要O(1)的时间复杂度,q次查询只需要n+q的时间复杂度。2.在程序b中分一次或多次计算出原创 2022-03-31 12:49:38 · 142 阅读 · 0 评论 -
two pointers思想-学习笔记
引入:给定一个递增的正整数序列和一个正整数M,求序列中的两个不同位置的数a和b,使得他们的和恰好为M,输出所有满足条件的方案。枚举法:for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(a[i]+a[j]==M){ printf("%d %d",a[i],a[j]); } }} two pointers:利用有序序列的枚举特性来有效降低复杂度。i=0,j=n-1,i、j分别指向序列的第一个和最后一个元素,根据a[i]+原创 2022-03-28 20:54:09 · 338 阅读 · 0 评论 -
二分法-学习笔记
二分查找猜数字游戏:玩家A从一个范围中选择一个数,然后让玩家B猜这个数字经典问题:如何在一个严格递增序列A中找出给定的数x。1.线性扫描序列中的所有元素2.二分查找,基于有序序列的查找算法,假设严格递增序列,该算法一开始令[left,right]为整个序列的下标区间,然后每次测试当前[left,right]的中间位置mid=(left+right)/2,判断A[mid]与预查询的元素x的大小:if A[mid]=x,查找成功,breakif A[mid]>x,说明元素x在mid位置的左边原创 2022-03-27 22:20:54 · 656 阅读 · 0 评论 -
贪心算法-学习笔记
局部最优策略pat b1020 月饼现有月饼需求量为D,已知n种月饼各自的库存量和总售价,问如何销售这些月饼,使得可以获得的收益最大,求最大收益。#include <cstdio>#include <algorithm>using namespace std;//存储每种月饼的数据 struct mooncake{ double store; //库存量 double sell; //总售价 double price; //单价 } cake[1010];原创 2022-03-26 21:34:49 · 348 阅读 · 0 评论 -
递归-学习笔记
原创 2022-03-25 18:00:06 · 815 阅读 · 0 评论 -
散列函数-学习笔记
散列:“将元素通过一个函数转换为整数,使得该整数可以尽量唯一地代表这个元素”直接把输入的数作为数组的下标来对这个数的性质进行统计——直接定址法除留余数法:H(key)=key%mod表长TSize(素数)>=mod,为方便起见,TSize=mod通过hashtable判断每个数是否出现过://hash函数#include <stdio.h>const int maxn = 100010;bool hashTable[maxn] = { false }; //此时hashTa原创 2022-03-24 13:20:00 · 330 阅读 · 0 评论 -
一些排序算法实例(选择,插入,sort函数)
(升序)#include <stdio.h>//选择排序void selectSort(int b[]){ for(int i = 0;i<10;i++){ int k = i; for(int j = i;j<10;j++){ //i~10中选出最小的,下标是k if(b[j]<b[k]){ k=j; //较小的是k } } int temp = b[i]; //最小的交换到待排序列最前 b[i] = b[k]; b[k]原创 2022-03-23 09:25:32 · 184 阅读 · 0 评论 -
sort函数的应用-【pat A1025】PAT Ranking
题意:n个考场,每个考场有若干数量考生。现给出各考场中考生的准考证号与分数,要求将所有考生按分数从高到低排序,并按顺序输出所有考生的准考证号、排名、考场号以及考场内排名。原创 2022-03-23 09:23:15 · 97 阅读 · 0 评论 -
【patB 算法笔记】1010.一元多项式求导
1010 一元多项式求导1010 一元多项式求导 (25 分)题目设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nxn−1 。)输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。输入样例:3 4 -5 2 6 1 -2 0输出样例:12 3 -10 1原创 2021-03-10 18:44:35 · 883 阅读 · 0 评论 -
【字符串问题】
codeup 5901.回文串题目读入一串字符,判断是否为回文串。正读反读都一样的字符串,比如level,noon输入12321输出YES思路遍历字符串的前一半,如果出现字符str[i]不等于其对称位置,就说明这个字符串不是“回文串”;如果前一半所有字符都对应,说明是回文串。i的对称位置==(len-1)-i==;String.h下的strlen()判断字符串长度;写一个bool函数返回YESorNO;代码#include <stdio.h>#include &原创 2021-03-09 11:57:56 · 152 阅读 · 0 评论 -
【进制转换】patB 1022.D进制的A+B
1022 D进制的A+B (20 分)1022.D进制的A+B题目输入两个非负 10 进制整数 A 和 B (≤230 −1),输出 A+B 的 D (1<D≤10)进制数。输入格式:输入在一行中依次给出 3 个整数 A、B 和 D。输出格式:输出 A+B 的 D 进制数。输入样例:123 456 8输出样例:1103思路P进制 -> Q进制P进制数x -> 十进制数yint y=0,product=1; //不断乘p的几次方while(x!=0){原创 2021-03-09 10:59:17 · 195 阅读 · 0 评论 -
【codeup 1928】日期差值
【codeup 1928】日期差值题目有两个日期,求两个日期之间的天数,如果两个日期是连续的,则规定它们之间的天数为两天。样例输入2013010120130105样例输出5分析求日期之间相差天数的题目 直接思路:令日期不断加1天,直到第一个日期等于第二个日期为止。为方便直接取出每个月的天数,给定一个二维数组int month[13][2],存放每个月的天数,第二维为0时表示平年,1表闰年代码...原创 2021-03-07 21:04:56 · 78 阅读 · 0 评论 -
【图形问题】1036.跟奥巴马一起编程
1036 跟奥巴马一起编程跟奥巴马一起编程 (15 分)题目:美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!输入格式:输入在一行中给出正方形边长 N(3≤N≤20)和组成正方形边的某种字符 C,间隔一个空格。输出格式:输出由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我原创 2021-03-07 19:45:10 · 110 阅读 · 0 评论 -
【codeup 1934】找x
题目:输入一个数n【1~200】,然后输入n个数值各不相同的数,再输入一个值x,输出这个值在这个数组中的下标(从0开始,不在数组中则输出-1)。输入样例41 2 3 43输出样例2代码#include <stdio.h>const int max=200;int main(){ int n; int mp[max]={}; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&mp[i]);原创 2021-03-07 19:05:02 · 67 阅读 · 0 评论 -
【patA 算法笔记】1065. A+B and C
1065. A+B and C1065 A+B and C (64bit) (20 分)原创 2021-03-06 18:21:17 · 269 阅读 · 0 评论 -
【patA 算法笔记】A1046.Shortest Distance 最短路径
A1046 Shortest Distance链接: 1046 Shortest Distance (20 分).题目:The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits.n个结点围成一个圈,相邻两点之间距离已知,每次只能移动到相邻点。给出m个询原创 2021-03-06 13:36:11 · 175 阅读 · 0 评论 -
【patA 算法笔记】A1042.Shuffling Machine
A1042.Shuffling Machine题目示例:suppose we only have 5 cards: S3, H5, C1, D13 and J2. Given a shuffling order {4, 2, 5, 3, 1}, the result will be: J2, H5, D13, S3, C1. If we are to repeat the shuffling again, the result will be: C1, H5, S3, J2, D13.输入格式:Ea原创 2021-03-06 11:44:59 · 212 阅读 · 3 评论 -
【patB 算法笔记】1018.锤子剪刀布
1018.锤子剪刀布原创 2021-03-06 10:34:22 · 338 阅读 · 1 评论