二分&二分答案(糖果模型,二分+暴力)
对于n,二分查找最多会执行logn次
log函数:其中OI中以2为底,且向上去整:有1000 = 2^10 = 1024
二分(不断划分区间最后找到目标值)
对于二分, 每次折半n,n/2,n/4···1的次数即logn
点击查看代码
int l = 1, r = n, ans = -1
while(l <= r) {
int mid = (l + r) / 2;
if(q[mid] == x) {
ans = mid;
break;
}
else if(q[mid] <= x) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
对于第一个or最后一个:采用不退出二分,继续找
点击查看代码
int l = 1, r = n, ans = -1;
while(l <= r) {
int mid = (l + r) / 2;
if(q[mid] == x) {
ans = mid;
// r = mid - 1;找第一个
l = mid + 1;//找最后一个
}
else if(q[mid] <= x) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
二分答案(思考:是否可以快速判读答案比x大还是小
二分本质是缩小问题规模,将问题变为n/x

糖果模型: 糖果只有绿和红两种颜色,且绿色在红色前面,现在他们被糖纸包裹
此问题满足二分性:对于我们找寻位置i上的ai,若为绿那么代表,1~i都为绿,若为红则i~n都为红,此时我们找寻i~n和1~i
对于问题是否能转化为糖果问题(前面都为绿,后面都为红),来判定问题是否满足二分性
对于二分区间的划分:选择中点仅因中点较稳定,三等分点等均可,时间复杂度也同样为logn
三等分点则每次排除1/3或2/3
l,r范围选用:
分答案边界根据情况选用即可,有时不用选用整个区间
立方根:选用整个区间立方时会爆long long
浙公网安备 33010602011771号