题目描述

实现 int sqrt(int x) 函数。

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

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

示例 1:

输入: 4

输出: 2

示例 2:

输入: 8

输出: 2

说明: 8 的平方根是 2.82842..., 

由于返回类型是整数,小数部分将被舍去。

解题思路1:暴力破解

1、当x=0时,返回0

2、当x>=4时,从2开始遍历至x/2,当前游标平方小于等于x且游标加一的平方大于x时,返回游标

3、当x>0且x<4时,返回1

class Solution {
public:
int mySqrt(int x) {
if(x==0){
return x;
}
for(long i=2;i<=x/2;i++){
if(i*i<=x&&(i+1)*(i+1)>x){
return i;
}
}
return 1;
}
};

复杂度分析

1、时间复杂度:O(n)

2、空间复杂度:O(1)

解题思路2:二分查找

由于 x 平方根的整数部分 rs 是满足 k^2 ≤x 的最大 k 值,因此我们可以对 k 进行二分查找,从而得到答案。

二分查找的下界为 0,上界可以粗略地设定为 x。在二分查找的每一步中,我们只需要比较中间元素 mid 的平方与 x的大小关系,并通过比较的结果调整上下界的范围。由于我们所有的运算都是整数运算,不会存在误差,因此在得到最终的答案 rs 后,也就不需要再去尝试 rs+1 了。

class Solution {
public:
int mySqrt(int x) {
int left=0,right=x;
int rs=1;
while(left<=right){
long mid=(left+right)/2;
if((mid*mid)<=x){
rs=mid;
left=mid+1;
}else{
right=mid-1;
}
}
return rs;
}
};

复杂度分析

时间复杂度:O(logx),即为二分查找需要的次数。

空间复杂度:O(1)。

欢迎关注微信公众号【算法攻城师】

Leetcode No.69 x 的平方根_二分查找