leetcode二分查找之求开方

Posted Hebye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode二分查找之求开方相关的知识,希望对你有一定的参考价值。

正常实现

Input : [1,2,3,4,5]
key : 3
return the index : 2

Input: 4
Output: 2

Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since we want to return an integer, the decimal part will be truncated.

一个数 x 的开方 sqrt 一定在 0 ~ x 之间,并且满足 sqrt == x / sqrt。可以利用二分查找在 0 ~ x 之间查找 sqrt。

对于 x = 8,它的开方是 2.82842...,最后应该返回 2 而不是 3。在循环条件为 l <= h 并且循环退出时,h 总是比 l 小 1,也就是说 h = 2,l = 3,因此最后的返回值应该为 h 而不是 l。

public int mySqrt(int x) {
    if (x <= 1) {
        return x;
    }
    int l = 1, h = x;
    while (l <= h) {
        int mid = l + (h - l) / 2;
        int sqrt = x / mid;
        if (sqrt == mid) {
            return mid;
        } else if (mid > sqrt) {
            h = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    return h;
}

 

以上是关于leetcode二分查找之求开方的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 二分搜索 - 求开方,Leetcode 69

二分查找---求开方

一点就透的二分查找算法

LeetCode(69):Sqrt(x)

AK leetcode 流浪计划 - 二分查找

leetcode查找算法(顺序查找,二分法,斐波那契查找,插值查找,分块查找)