【leetcode】69. Sqrt(x)(Python & C++)

来源:互联网 发布:键盘 编程 编辑:程序博客网 时间:2024/06/06 20:41

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. 思路一:直接从1到x/2之间遍历,判断是否是平方根的条件是,i*i小于等于x并且(i+1)*(i+1)小于x,则返回i。超时。

  2. 思路二:二分查找法。初始化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。

  3. 思路三:牛顿迭代公式。参见这里。暂时没时间看。

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

原创粉丝点击