算法题刷题总结


进制转换

while(n){
a[i++]=n%b;
b/=b;
}

Lca

lca要注意输入两个点相同;
bst求lca
根据左小右大的特点,最小祖先LCA的value一定处于u、v之间;
先序序列找第一个值在uv之间的。

中后序求 lca
在先序前列找; 第一个出现的满足要求的点;
一律大于等于小于等于;

Dijkstra

失误,把num写成了d;一定一定看清题意;
map<int, bool>G;代替邻接矩阵;G[same_gen[a][i]*10000+same_gen[b][j]]
中途点数量city_cnt和pre在所有if(>)时加上;一律city_cnt[v]=city_cnt[u]+1;num总共只在d的运算中覆盖(两次)
vis的判断(2处);vis=1(一处);
d、c、G要fill;pre[s]=-1;num[s]=1; w[s]=weight[s]; d[s]=0;city_cnt[s]=0;
当有很多起点的时候,让起点们从n+1开始计数;遍历地基斯特拉;

平衡二叉树

avl树也是边输入边insert;建新节点height=1;新建结点要创建空间;
get_height要判断空节点返回0;
左右旋先更新root,再更新temp;最后让root=temp;
改值加引用;
左旋最后root=temp;而不是temp=root;
bst边输入边&insert,传入root,data无返回值,递归截止root==null;
void insert(node *&root,int data)二叉排序树;链表树;
插入树一定要记得引用,镜像树只需要遍历左右递归互换;
对于长id或者字符id可以用map<string,vector >a; map<string,node>;

基础

数组赋值之道在于结构体;
有关map一定下标从1开始;
vis内key可能有负数时候用map;用map代替普通vis的优越性是key可以是负数;sort(s+1,s+cnt,cmp);
map代替hashtable,memset就是mp.clear();
do while 会至少执行一次,要善于利用;
这种问题都一个思路,先判断是否是圈,再判断是否是特点圈;
i和j别搞混是大问题;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
浮点错误一定是让除数或者%为0了,一定要先判断再运算d!=0&&c%d==0;
超时换clang++!!!
绝对要注意所有的结点控制格式输出05d这种情况;
每次查询一定要初始化,特别是栈要让其empty;
多次查询题目就每个记录试探一下,个例对整体错肯定错在初始化上;
bool cmp(int a,int b){ //vector;
return strcmp(int_str[a],int_str[b])<0;
}
bool cmp(string a,string b){
return a+b<b+a;
}
bool cmp(int a,int b){ //most very important;
if(cnt[a]!=cnt[b])
return cnt[a]>cnt[b];
else return a<b;
}
Sort内是初位置,尾元素后一个元素
字符串puts要比cout省时间特别多;
sum=0;一定别忘了初始化,不然一分都没有;
数组一定一定不要忘了初始化零;段错误检查之;
有rank的题还是先输出第一个人,令r=1,后面循环if(s[i].score!=s[i-1].score) r=i+1;
if(i!=0&&m[i].score!=m[i-1].score) rank=i;
一定一定不要忘了函数返回;
输入的时候一定要看顺序;
题目说如果全负数的话输出失败,注意只要有0则是成功的;
注意数字取值范围,是否用字符存储数字;
千万千万别忘了return;
map改成unordered_map;
对于分数项目多的node,要把每个项目都写进去,最后再一起求和除;
定义数组时,可以在cin>>n后,再int a[n],保存空间;
25分的图尽量不要用邻接矩阵,容易超时;
链表切块输出,把多个块并到一个vector中操作;
刷完整理一波题型;
1129是个好套路,包括vector排序,防止超时在大于一定数排序的时候,删除竞争力小的数据;
题目让输入整数时,直接最后强制转换,不要%.0lf;
多用全局变量,提别是递归,但要注意重复定义。
调试出问题(格式错误)最后一行换行,或者去掉换行;
看一下多大数可以用longlong多大用字符串;
cmp加引用加快速度
回文323,3322;
段错误先检查越界;
一定一定一定要注意i和j;
%05d;注意long long,20分题别想的太复杂;
每次查询绝对不要忘了初始化,如果出现单词查询不过,一起查询就错,那就是没有初始化,特别是要删图路径的;
在cin之前赋值了;
string转int忘记-‘0’,size()写成size()-1;vis后面没加中括号,
全局变量写的时候一定要不同类型避开,太容易写错了;
-std=c++11编译选项添加,可以让dev-c++支持c++11;

查找

哈希表直接查到次数1,查不到次数size+1,是query加0平方、1平方、到size平方;
平方弹测法Quadratic probing最高加到size的平方;
超时给cmp加引用,memset改for;
while(l<=r){ //查询x的下标;可能失败;
mid=(r+l)/2;
if(a[mid]>x) r=mid-1;
else if(a[mid]==x) return mid;
else l=mid+1;
}
return -1;
—————————————————————————
while(l<r){ //查询第一个大于或等于x的数,必成功;求中值;
mid=(r+l)/2;
if(a[mid]>=x) r=mid; //取等号,则第一个大于,括号内为查询条件;
else l=mid+1;
}
return l;;

中后序建树

注意中后序建树,k=in_l不是0,num_left=k-in_l;
建立树,一定要记住引用;
中后序建二叉树,root不用初始化,在函数内部建新节点并new node,递归条件是左大于右,最后要return root;
链表建立树一定一定不能忘记new node;

数据结构

链表要考虑cnt=0时,头结点-1情况;
树可以根据dep记录路径,每次dfs返回再进入会覆盖,故也不需要clear等操作;path[dep]=v[idx][i];
判断所给序列是不是栈,遍历序列,检测栈顶是不是当前序列,不是则按顺序push,直到栈顶满足,如果此时栈容量已满或者没找到该点(push前该元素已在栈底),则NO,或者按顺序push,若栈满NO,while栈顶满足所给序列元素,则不断pop;
分组胜者晋级模式题用队列解决,动态改变队列人数和组数,每组一个胜者,所有胜者数量又是下一论的组数;
1103 1021 dfs有价值;
可以用vector存每两个输入顶点的边为i,即每个顶点存它所有边的序号,这样判断边的存在性会省时很多;
求结点数,总权值,dfs传&值;
无向图dfs时删除边防止回头,访问完将路径归0,记得用vis;
无权图邻接表,有权图邻接矩阵;邻接矩阵要fill to inf;
degree度数;
dft用vector存树的层级,可以存储得到层序遍历结果;
判断完全二叉树先序遍历传index,记录max_index==n则完全二叉树;
已知先后序,如果后序倒数第二个等于先序第二个结点,则不唯一;
深度优先遍历死循环检查return有没有忘了写,临界条件是不是忘了判断,index有没有写成i;
树中缀表达式仅在非跟的有子结点时输出括号,进行中序遍历;

并查集

千万不要忘记return;特别是find-father;
并查集好好看;
并查集father都是元素,不是集合;
并查集要用course;union(i,course[h]);初始化所有元素的父亲为自己,最终某集合祖先是首个输入符合集合信息的元素;

Stl容器

v1.insert(v1.begin(),1);//在开始位置插入元素1 
v1.insert(v1.begin(),2,33);//在开始位置插入两个33  
v1.insert(v1.begin(),v2.begin(),v2.end());//在开始位置插入v2整个区间元素  

str.insert(0,2,'a');	//0位置插入2个a
str.insert(1,str);//index位置插入常量string
str.erase(10);// 从位置pos=10处开始删除,直到结尾
str.erase(str.begin()+10);//删除目标位置字符
str.erase(str.begin() + 10, str.end());//删除区间字符

for(set<char>::iterator it = st1.begin();it!=st1.end();it++){};	//set遍历

输入带空格string
string n1,n2;
getline(cin,n1);
vector做参数要引用。
用每条边1到m代表每条边值;从而用vector可以存储邻接矩阵;
reverse(v.begin()+left,v.begin()+right);vector和string都可以用;
transform(s.begin(),s.end(),s.begin(),::tolower);
int num=stoi(s2)-stoi(s1);string s3=to_string(num);
涉及到有很恶心的重复,用set;
string erase里面begin()和用数值删不同;begin类似与sort是上下界,数值第二个是长度;
要花时间总结一下cmp,特别是stl的,stl混合使用的;
map<string,set> title,author,key,publish,year; pat1022
string空间问题需要考虑时候,使用拼接;
对于长id或者字符id可以用map<string,vector >a; map<string,node>;
string要初始化内存空间,
vector.resize(n);
下面是vector内部排序:sort(v.begin(),v.end(),cmp);
set::iterator it=st.begin()

数学

注意求素数小于等于sqr;
素数要从2开始%;
判断素数要判断x<=1;int sqr=(int)sqrt(n*1.0);不需要向上取整;
小时t/3600,分钟t/60%60,秒t%60;
求gcd:return b==0?a:gcd(b,a%b);必须要从b开始;
正溢出正确,负溢出错误,注意必须先算res,res要带小于号;
科学计数法:1060典型;先删000001.32,再判断0.aa还是232.aa;

词汇

adjacent;undirected edges(无向边);Ancestor ;Quadratic probing;increments ;collisions;prime(素数);Heaps ;liars;lying;statement
infix expression;precedences;operators;parentheses;set(集合);Delayed ;to be qualified for a certificate;assignments;
prime number;guests;chain;segments;loops;Each;fold;halved;odd;even(奇偶数);alternating ;chess;placing;configuration;Recommendation;accessed(访问)
pivot基准;partition ;recommend ;intersections (顶点);identical;one-way(单向);type (打字);detected;partition ;disjoint ;denote
Palindromic Number;reversible;via;compute ;generated ;corresponds ;compiler;interval区间;boundaries ;graduate schools;entrance ;quota ;gets rejected by;
we use a negative sign to represent girls.Contact ; test level;institutions;lower case;case insensitive;clique ;permutation
combinatorial optimization;Recruitment ;giant ;constant ;consecutive ;threthold;monitoring ;clusters ;interval ;optimal ;commas
polynomial;zero;consistent;equation ;betting ;Triple ;standard notation;permutation;as squared as possible;suffix
Coupon ;bonus ;Course List;lottery ; bets on;procedure ;Shuffling ;mirror image;Stripe ;sewing ;Dominant;proportional
annual ;inventory ;carriage;regular ;suffix ;rational ;Deduplication ;partition (reverse,diverse,invert);infix expression;decimal十进制小数
is incident to(相关联)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小海绵【vincewm】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值