嗨嗨嗨,二分又来了,淦它,
这个题官解是,C++函数法,二分,和牛顿迭代法(暂且搁置),
当然还有暴力(不必讨论,就从0开始一个一个试),
69. x 的平方根 - 力扣(LeetCode)
目录
题目:
思路:
代码+注释:
每日表情包:
题目:
思路:
设所求之数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所代表的数字就像判断条件所说有些是> 有些是= 我们要等于而不要>)