题目
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
解法
二分法
- 定义左边界0,右边界x;取左右边界的中位数。
- 计算中位数的平方,判断与x之间的大小;小于x则收缩左边界,大于x则收缩右边界,如此循环
- 等右边界贴近左边界(甚至<)时,左边界则是最优解
1 2 3 4 5 6 7 8 9 10
| PS:取出中位数时一定要+1
否则会存在这种情况,进退两难进入死循环 如: 中位数:46339 left:46339 right:46340
而+1之后 如: 中位数:46339 left:46337 right:46340 中位数:46340 left:46339 right:46340
此时left:46339就是最优解
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public static long mySqrt(int x) {
long left = 0; long right = x / 2 + 1; while (left < right) { long mid = (left + right + 1) / 2; System.out.println("中位数:" + mid + " (left:" + left + " right:" + right + ")"); long square = mid * mid; if (square > x) { right = mid - 1; } else { left = mid; } } return (int) left; }
|