很骚的二分

先前我很蠢,觉得二分很简单,现在发现是我错了emoij哭。

102. 最佳牛围栏 - AcWing题库

看到一篇好题解,我想对这篇题解进行说明。

为什么一检测到符合条件的子串就立即返回TRUE了?

这是因为我们的目标是找到最大的平均值,而不是找到所有满足条件的子段。如果我们已经找到了一个子段,它的平均值不小于mid,那么我们就可以认为mid是一个可行的答案,然后我们可以继续增大mid来寻找更大的答案。如果我们检测了后面的子段,那么我们可能会浪费时间和空间,而且也不会影响最终的结果。你可以想象一下,如果有一个子段的平均值是10,而另一个子段的平均值是9,那么我们只需要知道存在一个平均值为10的子段就可以了,因为它已经比9大了。所以,一旦检测到符合条件的子段,就直接返回true是一种有效和简洁的做法。

为什么最后返回的是r而不是mid?

您好,这是Bing。我可以帮您解答您的问题。😊

您的问题是为什么题解代码最后打印的是r而不是mid。这个问题的答案是因为二分查找算法的性质。二分查找算法是一种在有序数组中查找目标元素的方法,它每次将搜索区间分成两半,然后根据目标元素和中间元素的关系,选择一半继续搜索。二分查找算法有两种实现方式,一种是迭代法,一种是递归法。

题解代码使用的是迭代法,它用两个变量l和r表示当前的搜索区间,然后用一个while循环不断更新l和r的值,直到l和r相遇或者相差很小(小于1e-5)。在循环中,每次计算中间值mid = (l + r) / 2,然后调用check函数判断是否满足条件。如果满足条件,说明目标值在[mid, r]区间内,所以更新l = mid;如果不满足条件,说明目标值在[l, mid]区间内,所以更新r = mid。

当循环结束时,l和r都接近于目标值,但是不一定相等。为了保证输出的结果是正确的,题解代码选择了打印r而不是mid。这是因为题目要求输出的结果是保留三位小数的整数2,而r的值总是比l的值大一点点(因为更新l时用的是l = mid而不是l = mid + 1),所以打印r可以保证不会丢失精度。如果打印mid,可能会出现四舍五入的情况,导致结果不准确。

递归二分和迭代二分的区别主要有以下几点:

- 时间复杂度方面,两种方法都是O(log n),因为它们都是每次将搜索区间缩小一半,直到找到目标元素或者区间为空¹。
- 空间复杂度方面,迭代二分更优,因为它只需要O(1)的额外空间,用来存储循环变量和中间值;而递归二分需要O(log n)的额外空间,用来存储递归调用的栈帧²。
- 代码结构方面,递归二分更简洁,因为它只需要一行代码来表示递归调用的逻辑;而迭代二分需要一个while循环来控制搜索过程³。
- 性能方面,迭代二分更快,因为它没有递归调用的开销,也没有栈溢出的风险;而递归二分可能会受到函数调用的时间消耗和栈空间的限制。

- [Iterative and Recursive Binary Search Algorithm - OpenGenus IQ](^1^)
- [Recursive and Iterative Binary Search: Which one is more efficient and why? - Stack Overflow](^2^)
- [Iterative vs Recursive Binary Search Algorithms: Exploring the Differences in Asymptotic Analysis](^3^)
- [Ordered Binary Search w/ Assembly | Recursive vs. Iterative vs Library - Stack Overflow](^4^)
(1) Iterative and Recursive Binary Search Algorithm - OpenGenus IQ. https://iq.opengenus.org/binary-search-iterative-recursive/.
(2) algorithm - Recursive and Iterative Binary Search: Which one is more .... https://stackoverflow.com/questions/57481997/recursive-and-iterative-binary-search-which-one-is-more-efficient-and-why.
(3) Iterative vs Recursive Binary Search Algorithms: Exploring the .... https://saturncloud.io/blog/iterative-vs-recursive-binary-search-algorithms-exploring-the-differences-in-asymptotic-analysis/.
(4) c++ - Ordered Binary Search w/ Assembly | Recursive vs. Iterative vs .... https://stackoverflow.com/questions/9445284/ordered-binary-search-w-assembly-recursive-vs-iterative-vs-library.
(5) Iterative and Recursive Binary Search Algorithm - OpenGenus IQ. https://iq.opengenus.org/binary-search-iterative-recursive/.
(6) algorithm - Recursive and Iterative Binary Search: Which one is more .... https://stackoverflow.com/questions/57481997/recursive-and-iterative-binary-search-which-one-is-more-efficient-and-why.
(7) Iterative vs Recursive Binary Search Algorithms: Exploring the .... https://saturncloud.io/blog/iterative-vs-recursive-binary-search-algorithms-exploring-the-differences-in-asymptotic-analysis/.
(8) c++ - Ordered Binary Search w/ Assembly | Recursive vs. Iterative vs .... https://stackoverflow.com/questions/9445284/ordered-binary-search-w-assembly-recursive-vs-iterative-vs-library.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值