题意分析
- 这个题目题目意思很简洁,就是让我们求出一个数的开根号之后的数据,向下进行取整。
思路分析
解法一 二分
- 我们发现,最后的答案具有单调性,当我们求出某一个数字为mid的时候,我们可以和给出的数字进行比较,判断这个数字是大了还是小了,从而移动我们的边界。这样通过左右边界的移动我们最后就可以不断逼近最后的终点了。
- 代码如下,
- 二分的时间复杂度为O(logn)
- 只开了几个变量,空间复杂度为O(1)
class Solution {
public:
/**
*
* @param x int整型
* @return int整型
*/
int mysqrt(int x) {
// write code here
// 特判
if(x<=0){
return 0;
}
// 利用二分进行求解
int l=1,r=x,mid;
while(1){
mid=(l+r)>>1;
// 这个地方需要好好理解一下,因为题目上面说是进行向下取整
if(mid<=x/mid&&(mid+1)>x/(mid+1)){
return (int)mid;
// 找到的点过小
}else if(mid<x/mid){
l=mid+1;
// 找到的点过大
}else{
r=mid-1;
}
}
}
};解法二 数学定理
- 我们首先需要了解一个牛顿迭代公式。(部分图片来自百度)
知道了这个之后,我们就可以根据这个公式进行求解了。
- 代码如下
- 二分的时间复杂度为O(logn)
- 只开了几个变量,空间复杂度为O(1)。
class Solution {
public:
/**
*
* @param x int整型
* @return int整型
*/
int mysqrt(int x) {
// write code here
// 特判0的情况
if(x<=0){
return 0;
}
int r=x;
// 利用牛顿迭代式进行求解
while(r>x/r){
r=(r+x/r)/2;
}
return int(r);
}
};
京公网安备 11010502036488号