第一章视频笔记
1⃣️视频看算法模版
2⃣️课下要背算法的模版,理解的去背
3⃣️课下要做模版题 一个题目要做个两三遍,做到能一次一分钟的把模版打出来
一。快速排序
1.采用分治的思想
1⃣️确定分界点,有三种:左端点,右端点和中间
2⃣️调整区间
3⃣️递归处理左右两端
2.对于第二步调整区间
1⃣️方法一:暴力法
另外开两个数组,全部搜一遍数组 把在区间分界点两部分的数组分别放入到另开的两个数组里面,然后再依次放回到原数组中
2⃣️方法二:交换法 (优美指针)
就是在首尾用两个指针指示,然后当不满足要求时就交换,并且这种边界容易出现问题的算法可以背模版
PS:Java要用bufferead?C用scanf更好?
Java的bufferead 比Scanner块十多二十倍
二。归并排序
1⃣️确定分界点,这个的分界点是要去中间的,快排的话是可以取随机,左端点或者右端点,或者中间,归并的话就是直接mid=(l+r)/2
2⃣️递归排序左区间和右区间
3⃣️归并左右区间,合二为一
三。二分
1。整数二分
整数的二分的本质是边界问题,即将整个区间一分为二,左边为满足性质,右边为不满足性质,并且由于整数它不具有连续性,所以左边界与右边界不一定相同,因此整数二分的时候要同时考虑找两种边界的情况。两种边界分别对应两种模版,具体用哪个模版看第1点。
有单调性一定可以二分,但没有单调性的也可能进行二分
1.选择二分模版的时候的方法:
1⃣️先写出check函数 (每一次都选择答案所在的区间ture区间)
2⃣️观察check函数中true情况下更新区间的方法
3⃣️true情况下更新区间如果是l=Mid的话则mid=l+r+1 /2反之如果是r=mid的话则是mid=L+r/2
//找左边界:对应的是mid=l+r>>1的模板
//找右边界:对应的是mid=l+r+1>>1的模板
注意⚠️!找左边界的时候,if的check函数看左边界的右侧,即在左边界的右侧的即是true,满足性质,更新区间。找右边界的时候,if的check函数看右边界的左侧,即在左右边界的左侧的即是true,满足性质,更新区间。
2。浮点数二分
边界的范围一般要比题目多两位,比如题目让你保留6位则是1e-8,四位则是1e-6