x 的平方根
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 26 ms, 内存: 16.1 MB
/*
* 思路:
* 使用Java Stream的特性可以简化代码,通过生成一个范围流并过滤出小于等于x平方根的最大整数。
* 不过这种方法效率较低,实际开发中不推荐。
*/
import java.util.stream.IntStream;
public class Solution {
public int sqrt(int x) {
return IntStream.rangeClosed(0, x)
.filter(i -> i * i <= x)
.max()
.orElse(0);
}
}
解释
方法:
本题解使用二分查找算法来寻找非负整数 x 的平方根。初始化左边界 l 为 0,右边界 r 为 x。在循环中,计算中间值 mid 为 l 和 r 的平均值。若 mid 的平方大于等于 x,则将右边界 r 更新为 mid,否则将左边界 l 更新为 mid + 1。循环直到左边界小于右边界。最后,如果 l 的平方等于 x,则返回 l,否则返回 l-1,因为此时 l 的平方大于 x 且 (l-1) 的平方小于 x。
时间复杂度:
O(log x)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在计算中点时选择使用`(l + r) // 2`而不是`(l + r + 1) // 2`?
▷🦆
在二分查找时,为什么当`mid * mid >= x`时更新右边界`r`为`mid`,而不是`mid - 1`?
▷🦆
如果输入的`x`非常大,比如接近整型的最大值,这个算法处理大数时的性能如何?是否会有整数溢出的问题?
▷