这周我绝对没有看够五十篇(忏悔)。看过他人的总结才知道他人的努力,自己的不足。太懒散了,做事总是容易发呆走神,心思太杂了。
大体的看了:
复杂度,预估算法的效率,也就是看有没有可能超时
枚举:一是要想明白要枚举什么,二是如何减少枚举。与到题不会了,就枚举。(感觉后门面除了模拟,分治,构造,剩下的本质都是枚举,只是方式不一样)
模拟: 用在一些比较现实的问题把。要分布写,分条例,一定仔细。
递归&分治:这个思想方法好强。在看快速排序的时候,深刻的理解到它的强大,可惜不太会用。
分治:把一个大问题分解成众多小问题,然后小问题都解出来了,大问题也就解出来了。
分治中有个特例感觉很有意思,叫做减治,我在看top k 问题时看到的。同样是分成众多问题,但只要证明其中的一个就可以解决全部的问题了,比如二分法。我简单这个思想可以用在求局部的问题,就是去减少资源的分配和浪费,只去解决我们需要解决的部分。
贪心:一脸懵逼。适用范围就用在可以分成子问题?我简单就是可以把问题分成一个个相同的问题。用贪心要证明:一是交换顺序不变;二是归纳(还没见过这样的例题)。解法:后悔,排序。
二分:还有三分。。就是查找的时候用吧。需要注意区间(区间弄得我晕头转向)。
前缀和 在区间里重复查找时用
差分 在区间里重复大量增加数值的时候用
倍增:也就了解了了解
构造:数学上的模拟?
看完后这些算法基础后,感觉算法大体上有些是相似的,如果只是要解决问题的话,没有必要分的清清楚楚,我们现在只要了解他们的思想,扩展自己的思路,但不要局限于往上套;也没有绝对完美的算法,效率高的算法,可能适用范围少或者内存消耗大,我们要因题而定。
打算先再把知识通读一遍,每个知识的时候做几道例题(不能盲人摸象,也扩宽一下思路)。后面在狂刷某个知识的题目,加深(见多识广,也算是打好基础)。
我觉得哪里不会看哪里是学习一个东西最快的方法,但是眼高手低,就是想系统 的看一下。而行如果不了解全貌,就很难了解哪些是会的,哪些是不会的。
其他知识:
卡常 (玄学)利用计算机原理的知识提高运行速度 二进制运算 >><< int 代替 bool
常变量用常数等
少取模 逗号表达式 内联函数 还有个for循环展开(不会)
NULL 在c++中是整数,nullptr 指针
二进制的部分运算。
固定坐标是可以用const int x[],const int y[] 来表示;
不要思维太死板,数值是存东西才用的;有些字符,数字,输赢等等,只是个符号,用1,0之类的都可以表示。
要区分大小就用max min函数;条件判断的时候,想想能不能整合在一起,宏观的去看去想
交换两个数的时候可以用swap函数,也可以把结构体中的元素交换
看不懂就不要一直看,你又不是天赋异禀。当阅读量,题量上来的时候,前面不懂的自然就会了。同样就看两三遍,记不住就就不用记了,当你下次用到不会的时候在查找(现在查个东西太容易了)。记就要记到会用,不然就是浪费时间。