目录

1、题目

实现 ​​int sqrt(int x)​​ 函数。

计算并返回 ​​x​​​ 的平方根,其中 ​​x​​ 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

输入: 4
输出: 2

示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。

2、思路

(二分) 精选力扣500题 第31题 LeetCode 69. x 的平方根【c++ / java 详细题解】_java代码

我们二分出最大的 精选力扣500题 第31题 LeetCode 69. x 的平方根【c++ / java 详细题解】_二分_02 ,那么​​​y​​就是答案

过程

  • 1、我们从​​l = 0​​​,​​r = x​​​开始,先让​​mid = (l + r + 1)/2​
  • 2、如果​​mid * mid <= x​​​ ,则往右边查找,即​​l = mid​​​,否则往左边查找,即​​r = mid - 1​​。

图示过程

精选力扣500题 第31题 LeetCode 69. x 的平方根【c++ / java 详细题解】_数据结构与算法_03
时间复杂度 精选力扣500题 第31题 LeetCode 69. x 的平方根【c++ / java 详细题解】_java代码

注意点

  • 1、​​r​​​最大可以取​​INT_MAX​​​,再加上​​1​​​就会超出​​int​​​范围,因此我们将其写成​​l + r +1ll​​​强转为​​long long​​​类型,再​​/2​​就不会出现越界情况了。
  • 2、​​mid * mid​​​可能会超出​​int​​​的范围,因此判断条件写成​​if( mid <= x/mid )​​。

3、c++代码

class Solution {
public:
int mySqrt(int x) {
int l = 0 , r = x;
while(l < r)
{
int mid = (l + r + 1ll)/2;
if(mid <= x/mid) l = mid;
else r = mid - 1;
}
return r;
}
};

4、java代码

class Solution {
public int mySqrt(int x) {
int l = 0, r = x;
while(l < r)
{
int mid = (int)(l + r + 1L >> 1);
if(mid <= x / mid) l = mid;
else r = mid - 1;
}
return l;
}
}

原题链接:​​69. x 的平方根​​​精选力扣500题 第31题 LeetCode 69. x 的平方根【c++ / java 详细题解】_java代码_05