专栏文章
进食二分初学者:二分注意事项(区间分类)
算法·理论参与者 1已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @minodrw4
- 此快照首次捕获于
- 2025/12/02 05:42 3 个月前
- 此快照最后确认于
- 2025/12/02 05:42 3 个月前
不要闭门造车的搓“二分”轮子
使用二分的时候,如果不了解几个核心量的关系,就很容易搓出来各种WA和TLE
//本蒟蒻今天写了一下午二分一直#1WA+#6TLE过不了,问学长的时候被骂的梨花带雨(划掉)“左开右开的二分我真没见过几个人写” *嫌弃
影响因素:神秘下取整、指针位置、区间&&子区间意识、返回||循环条件
我们先来说区间
1:指针位置决定区间类型
两个指针的位置将数组括起来,形成一个区间。根据指针位置确定区间类型。
例如:
①对于数组{1,2,3,4,5},我们将指针放在1和5的位置(即索引为0和4),这时候的区间是[0,4]
②对于数组{1,2,3,4,5},我们将指针放在1和“6”的位置(即索引为0和5),这时候的区间是[0,5)
上面两个例子分别称为左闭右闭和左闭右开。你可以不理解,如果看完还不理解再回来看就好了
2:区间与子区间
......我们写二分,每次循环都得到一个区间更小的子区间,直到找到答案结束。
为了让所有元素都能够被调查一遍——要么在二分前期被舍弃,要么在二分后期被检测middle值是否与待查值相等——我们需要让子区间不与已检查的上一层middle元素重叠 ///其实我也不知道是为什么
假设有这样的数组{1, n个数, 80, 81, 82, n个数, 161}。
如果我们的区间是[0,160],那么二分一次后,81被检查,如果待查数在左边,子区间应该是[0,79]还是[0,80]呢?为了不与已经检查的81重叠,我们选择list[middle-1](即80)作为新的右指针
如果是[0,161),那么在一次二分之后虽然81已经被检查,但是我们实际上要检查的范围还是[0,79],则子区间应该是[0,80)而不是[0,79)(就像前面[0,160]与[0,161))
3:终止条件
简单讲这一部分,保证每一个元素都被调查过
对于[]区间,用while循环写的时候,while条件为(l <= r),可以认为我们需要检查[n,n]这个区间,实际上就是检查n这个元素
对于[)区间,用while循环写的时候,while条件为(l < r),可以认为到结束的时候,最小那个区间为[n,n+1),这时,就如上边讲子区间的时候,我们实际上检查的依旧是n这个元素。
我们先来说区间
1:指针位置决定区间类型
两个指针的位置将数组括起来,形成一个区间。根据指针位置确定区间类型。
例如:
①对于数组{1,2,3,4,5},我们将指针放在1和5的位置(即索引为0和4),这时候的区间是[0,4]
②对于数组{1,2,3,4,5},我们将指针放在1和“6”的位置(即索引为0和5),这时候的区间是[0,5)
上面两个例子分别称为左闭右闭和左闭右开。你可以不理解,如果看完还不理解再回来看就好了
2:区间与子区间
......我们写二分,每次循环都得到一个区间更小的子区间,直到找到答案结束。
为了让所有元素都能够被调查一遍——要么在二分前期被舍弃,要么在二分后期被检测middle值是否与待查值相等——我们需要让子区间不与已检查的上一层middle元素重叠 ///其实我也不知道是为什么
假设有这样的数组{1, n个数, 80, 81, 82, n个数, 161}。
如果我们的区间是[0,160],那么二分一次后,81被检查,如果待查数在左边,子区间应该是[0,79]还是[0,80]呢?为了不与已经检查的81重叠,我们选择list[middle-1](即80)作为新的右指针
如果是[0,161),那么在一次二分之后虽然81已经被检查,但是我们实际上要检查的范围还是[0,79],则子区间应该是[0,80)而不是[0,79)(就像前面[0,160]与[0,161))
3:终止条件
简单讲这一部分,保证每一个元素都被调查过
对于[]区间,用while循环写的时候,while条件为(l <= r),可以认为我们需要检查[n,n]这个区间,实际上就是检查n这个元素
对于[)区间,用while循环写的时候,while条件为(l < r),可以认为到结束的时候,最小那个区间为[n,n+1),这时,就如上边讲子区间的时候,我们实际上检查的依旧是n这个元素。
有关下取整这个不写了,下取整这个相关的是左开右闭要看,一笔带过就是左开右闭取middle值的时候需要+1
如果还有看不懂的可以看CSDN的这个链接,细节更丰富(可以说我不是为了京式猴刃写的,是为了写个小笔记)
https://blog.csdn.net/m0_63303316/article/details/123780707
本来是发在P2249的讨论区来着,但是犇犇们说可以读一遍题解规范然后申请题解/全站推广的来着,我就发在专栏了
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...