1.题目
实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
2.答题
2.1 思路1(二分法)
取high为x,low为0
middle为high和low的中间值,
若middle * middle 等于 x,middle为指定值
若middle * middle 大于 x,low右移为middle的值
若middle * middle 小于 x,high左移为middle的值
边界值:x==0或1时,返回x。
注:测试的时候8总是超时,跟进看了一下当low==2、high==3时,死循环了,所以改变了循环判断条件为low < high - 1
class Solution {
public int mySqrt(int x) {
if (x == 1) {
return 1;
}
int low = 0;
int high = x;
while (low < high - 1) {
int middle = (low + high) / 2;
int val = x / middle;
if (val == middle) {
return middle;
} else if (val > middle) {
low = middle;
} else {
high = middle;
}
}
return low;
}
}
时间复杂度
由于使用了1层循环的嵌套,所以为:O(n)
空间复杂度
常量空间复杂度:O(1)