美文网首页程序员
二分法算法题,两种解题模板的区别

二分法算法题,两种解题模板的区别

作者: 吴永祺 | 来源:发表于2019-10-19 20:56 被阅读0次

市面上流传着两种二分法的解题模板,这里以二分法求平发根为例子,分析一下它们的区别。

第一种:

# l, r 分别是当前区间的左、右界,m是二分的中间点

while l < r:

    m = (l + r + 1) >> 1

    if left(m):

        r = m - 1

    else:

        l = m

return l

第二种:

while l < r:

    m = (l + r) >> 1

    if left(m):

        r = m

    else:

        l = m + 1

return l

left方法判断目标是否在m的左边。

求向下取整的平方根的题目中,left方法可以这么写(注意python中整型的除法是//,两个斜杠):

# 求x的平方根,这里x是全局变量

def left(m):

    return True if x // m < m else False

那么问题来了,求平方根应该用模板一,还是模板二呢?

答案是模板一。

为什么?我们以8的开平方作为例子分析一下。

8的平方根在2和3之间,因此2是正确答案

假设当m求到了2,这时候精确解是在m的右边的,所以我们取右区间(移动l);

2是正确答案,显然也需要划分到右边,所以要求 l = m (模板一);

假设当m求到了3,这时候精确值在左边,取左区间(移动r);

3肯定不符合要求了,不用划分到左边,所以 r = m - 1(还是模板一)。

也就是说,向下取整要求我们用模板一,每次划分为 [l, m - 1] 和 [m, r] 两个区间;

模板二则划分为 [l, m] 和 [m+1, r]。

两个模板的区别在于把m划分到哪一边。

那么,什么时候该用模板二呢?如果题目要求向上取整,用前面的思路推一遍,可以发现应该用模板二。这时候left也得改一下,大家可以想想为什么。(提示:考虑刚好命中精确解的情况)

相关文章

  • 二分法算法题,两种解题模板的区别

    市面上流传着两种二分法的解题模板,这里以二分法求平发根为例子,分析一下它们的区别。 第一种: # l, r 分别是...

  • 面试题高频算法题整理

    以下算法题几乎都是简单题,都为面试算法题值得刷的题,需要理解并记住解题思路,而其中★标注的题,更是面试算法题中的高...

  • LeetCode每日一题 之 矩阵中的路径

    题目 image 题目地址 解题思路 这道题和之前的一道机器人走格子的算法题很像,都是根据深度优先的回溯方法解题。...

  • ORID27

    [127] Word Ladder解题报告 BFS算法 用什么算法?这道题需要用 BFS为什么用这个算法(那些条件...

  • LeetCode 刷题之路 python版 v2.0

    又想找工作了,记录下刷题的过程,争取每天一题 DFS 解题模板[https://www.jianshu.com/p...

  • 398.leetcode题目讲解(Python):随机数索引(R

    题目 解题思路 这道题比较简单,有两种解题思路: 解法一 遍历nums,记录索引位置,然后通过random.sam...

  • 滑动窗口

    滑动窗口算法 口诀心法 解题模板 Leetcode 上的几道经典试题 leetcode76. 最小覆盖子串 难...

  • [Week1]双指针算法

    Week1/2 刷题 (7.9 - 7.23) 复杂度理论与双指针算法入门 必须熟练掌握的两个排序算法 二分法 三...

  • LeetCode 二叉树专题 (1)二叉树知识 和 解题框架

    算法题中树相关的题目是相对比较难的,同时在开始刷算法题时,也最好先从树型题刷起,因为他的解题思想对以后各种题型都是...

  • 算法总结篇-(1)--算法思想

    算法包括三部分:算法思想 + 排序算法 + 查找算法 算法思想: 算法思想 就是 解题思路。常见的解题思路有如下:...

网友评论

    本文标题:二分法算法题,两种解题模板的区别

    本文链接:https://www.haomeiwen.com/subject/zimnmctx.html