69. Sqrt(x)
[题目链接]https://leetcode.com/problems/sqrtx/description/)
69.1 题目描述:
Implement int sqrt(int x).
Compute and return the square root of x.
69.2 解题思路:
思路一:直接从1到x/2之间遍历,判断是否是平方根的条件是,i*i小于等于x并且(i+1)*(i+1)小于x,则返回i。超时。
思路二:二分查找法。初始化i=0,j=x,mid=0。进入循环,找到中间值mid = (i + j) / 2,如果mid>x / mid,表示mid不是平方根,且数值过大,则j=mid。如果mid小于等于x / mid,则判断(mid + 1) > x / (mid + 1),表示mid*mid小于x,并且mid再加1后的平方就会比x大,这表示mid就是那个平方根,返回mid。否则表示mid过小,i=mid。
思路三:牛顿迭代公式。参见这里。暂时没时间看。
69.3 C++代码:
1、思路一代码(超时):
class Solution127 {
public:
int mySqrt(int x) {//超时
if (x == 0 || x==1)
return x;
for (int i = 1; i <= x / 2;i++)
{
if (i*i == x)
return i;
if (i*i < x && (i + 1)*(i + 1)>x)
return i;
}
}
};
class Solution127_1 {
public:
int mySqrt(int x) {//超时
if (x == 0 || x == 1)
return x;
int i = 0;
int j = x;
int mid;
while (i<=j)
{
mid = (i + j) / 2;
if (mid*mid > x)
j = mid;
else
{
if ((mid + 1)*(mid + 1)>x)
return mid;
i = mid;
}
}
}
};
2、思路二代码(6ms)
class Solution127_2 {
public:
int mySqrt(int x) {
if (x == 0 || x == 1)
return x;
int i = 0;
int j = x;
int mid;
while (1)
{
mid = (i + j) / 2;
if (mid>x / mid)
j = mid;
else
{
if ((mid + 1) > x / (mid + 1))
return mid;
i = mid;
}
}
}
};
3、思路三代码(6ms)
class Solution127_3 {
public:
int mySqrt(int x) {
long r = x;
while (r*r>x)
{
r = (r + x / r) / 2;
}
return r;
}
};
69.4 Python代码:
2、思路二代码(78ms)
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x==0 or x==1:
return x
i=0
j=x
mid=0
while True:
mid=(i+j)/2
if mid>x/mid:
j=mid
else:
if (mid+1)>x/(mid+1):
return mid
i=mid
3、思路三代码(45ms)
class Solution1(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
r=x
while r*r>x:
r=(r+x/r)/2
return r

本文介绍LeetCode第69题求平方根的三种解法:暴力搜索(超时)、二分查找(6ms)及牛顿迭代法(6ms)。通过C++与Python代码实现,对比不同算法的效率。
272

被折叠的 条评论
为什么被折叠?



