019 x 的平方根
1.1 思路一:暴力解法
1.1.1 算法思路
依次枚举 [0, x] 之间的所有数。找到结果之后直接返回,无需过度研究枚举区间。
(1)如果 i * i == x,直接返回; (2)如果 i * i > x,说明之前的一个数是结果,返回 i - 1。
由于 i * i 可能超过 int 的最大值,因此使用 long long 类型。
1.1.2 算法实现
class Solution {
public:
int mySqrt(int x) {
// 由于两个较大的数相乘可能会超过 int 最大范围
// 因此用 long long
long long i = 0;
for (i = 0; i <= x; i++) {
// 如果两个数相乘正好等于 x,直接返回 i
if (i * i == x) return i;
// 如果第一次出现两个数相乘大于 x,说明结果是前一个数
if (i * i > x) return i - 1;
}
// 为了处理 oj 题需要控制所有路径都有返回值
return -1;
}
};
时间复杂度:O(n),空间复杂度:O(1)。
1.2 思路二:二分查找
1.2.1 算法思路
设 x 的平方根的最终结果为 index。
- 分析 index 左右两次数据的特点:
(1)[0, index] 之间的元素,平方之后都是小于等于 x 的; (2)[index + 1, x] 之间的元素,平方之后都是大于 x 的。
因此可以使用二分查找算法。
1.2.2 算法实现
class Solution {
public:
int mySqrt( x) {
(x < ) ;
left = , right = x;
(left < right) {
mid = left + (right - left + ) / ;
(mid * mid <= x) left = mid;
right = mid - ;
}
left;
}
};


