LeetCode:69.x的平方根

嗨嗨嗨,二分又来了,淦它,

这个题官解是,C++函数法,二分,和牛顿迭代法(暂且搁置),

当然还有暴力(不必讨论,就从0开始一个一个试),

69. x 的平方根 - 力扣(LeetCode)

目录

题目:

思路: 

代码+注释:

每日表情包:


题目:

LeetCode:69.x的平方根_第1张图片

思路: 

设所求之数a,a对x,要满足 a^2 <= x  && (a + 1)^2 >x

我们可以根据这个找a条件去写一个二分查找,

if (mid <= x) //上述虽说看上去是两个条件但实际上可以看作一个条件,

代码+注释:

int mySqrt(int x) {
    int l = 0, r = x;
    while(l <= r){
        long long mid = l + ((r - l) >> 1);
        if(mid * mid <= x){
            l = mid + 1;
        }
        else{
            r = mid - 1;
        }
    }
    return r;
}
//根据while循环条件,及其内部的调整语句可知,r在l的紧左边,把r和l(所代表的整数)之间想象成一条线
//线的左边都是平方<=x的,线的右边都是平方>x的,设我们要的是a x >= a^2 && x <(a + 1)^2
//所以我们要的是左边的紧挨线的那个,r 或者 l - 1

又到了思考,为什么等于号不在else(R)那里而是在L那里,根据while循环条件和if判断条件可知,L的右边数的平方是>= x,情况不好判断了,因为我们要找的数一部分在L - 1 或者r,一部分在L里(L所代表的数字就像判断条件所说有些是> 有些是= 我们要等于而不要>)

每日表情包:

LeetCode:69.x的平方根_第2张图片

你可能感兴趣的:(leetcode,算法,c语言,数据结构)