这周我绝对没有看够五十篇(忏悔)。看过他人的总结才知道他人的努力,自己的不足。太懒散了,做事总是容易发呆走神,心思太杂了。
大体的看了:
复杂度,预估算法的效率,也就是看有没有可能超时
枚举:一是要想明白要枚举什么,二是如何减少枚举。与到题不会了,就枚举。(感觉后门面除了模拟,分治,构造,剩下的本质都是枚举,只是方式不一样)
模拟: 用在一些比较现实的问题把。要分布写,分条例,一定仔细。
递归&分治:这个思想方法好强。在看快速排序的时候,深刻的理解到它的强大,可惜不太会用。
分治:把一个大问题分解成众多小问题,然后小问题都解出来了,大问题也就解出来了。
分治中有个特例感觉很有意思,叫做减治,我在看top k 问题时看到的。同样是分成众多问题,但只要证明其中的一个就可以解决全部的问题了,比如二分法。我简单这个思想可以用在求局部的问题,就是去减少资源的分配和浪费,只去解决我们需要解决的部分。
贪心:一脸懵逼。适用范围就用在可以分成子问题?我简单就是可以把问题分成一个个相同的问题。用贪心要证明:一是交换顺序不变;二是归纳(还没见过这样的例题)。解法:后悔,排序。
二分:还有三分。。就是查找的时候用吧。需要注意区间(区间弄得我晕头转向)。
前缀和 在区间里重复查找时用
差分 在区间里重复大量增加数值的时候用
倍增:也就了解了了解
构造:数学上的模拟?
其他知识:
排序:快速排序冒泡排序简单插入排序希尔排序简单选择排序。
这些排序没有谁一定快谁一定慢,场景不同,优劣自然不同。但一般都是一个sort()就可以解决的。
卡常 (玄学)利用计算机原理的知识提高运行速度 二进制运算 >><< int 代替 bool
常变量用常数等
少取模 逗号表达式 内联函数 还有个for循环展开(不会)
NULL 在c++中是整数,nullptr 指针
二进制的部分运算。
固定坐标是可以用const int x[],const int y[] 来表示;
不要思维太死板,数值是存东西才用的;有些字符,数字,输赢等等,只是个符号,用1,0之类的都可以表示。
要区分大小就用max min函数;条件判断的时候,想想能不能整合在一起,宏观的去看去想
交换两个数的时候可以用swap函数,也可以把结构体中的元素交换。