《面试笔试算法上》-二分专题
- 大统领投票(排序):结构体(字符串、编号)排序(
const node &a
) - 吃瓜群众:结构体排序+朴素二分(1.
while(l < r)
2. mid 3. 判等 4. 小于or大于);细节(int mid = ((long long)l + r)
) - 吃瓜群众升级:特殊二分(
00001111
情况,套路:1.while (l != r)
2.mid = (l + r) / 2
3.if (t <= f[mid]) r = mid
4.l = mid + 1
);瓜节点(最大瓜,超int); - ☆ 暴躁的程序员(最近的程序猿最大距离):二分答案;模式(最大的最小的;最小的最大的);解题思路(1. 答案的边界值 2.判断
0011
还是1100
3. 关键函数(根据答案ans
得判断依据cond
));对于111000
的套路是(1.while (l != r)
2.mid = (l + r + 1) / 2
3.if (func(ans_mid) >= cond) l = mid
4.r = mid - 1
);代码(int n ,m;
定义在全局区,对于函数中也可以直接使用) - ☆ 切绳子(小数二分):浮点数的步骤(1.
while (r - l > EPSLON)
2.double mid = (l + r) / 2
3.if () l = mid
4.r = mid
);注意:if();l = mid, r = mid
条件判断的大于小于号要符合实际要求;直接舍弃小数点后两位的小数(printf("%.2f", (int)(l * 100) / 100.0)
);替代floor
函数,double / double 给到int中
- leetcode-278:第一个错误版本:leetcode刷题环境;
int mid = ((long long)l + r) / 2;
(防止整型溢出)
参考文献
2.二分专题