leetcode69 Sqrt(x)

 1 """
 2 Implement int sqrt(int x).
 3 Compute and return the square root of x, where x is guaranteed to be a non-negative integer.
 4 Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
 5 Example 1:
 6 Input: 4
 7 Output: 2
 8 Example 2:
 9 Input: 8
10 Output: 2
11 Explanation: The square root of 8 is 2.82842..., and since
12              the decimal part is truncated, 2 is returned.
13 """
14 """
15 一道easy题被我做的一波三折
16 """
17 """
18 第一种解法 遍历找i*i <= x <(i+1)*(i+1)
19 wrong answer
20 Input: 2147395599
21 Output: 99
22 Expected: 46339
23 """
24 class Solution1:
25     def mySqrt(self, x):
26         for i in range(100):
27             if i*i <= x <(i+1)*(i+1):
28                 break
29         return i
30 """
31 第二种解法开始考虑二分,但
32 Time Limit Exceeded
33 """
34 class Solution2:
35     def mySqrt(self, x):
36         i = x // 2
37         while i*i != x:   #这里没有抓住本质的停止迭代条件
38             if i*i > x:
39                 i = i // 2
40             else:
41                 i = ((i // 2) + i) // 2
42         return i
43 """
44 正确的二分法,left, mid, right
45 """
46 class Solution3:
47     def mySqrt(self, x):
48         left = 0
49         right = x
50         while left <= right:
51             mid = (left + right) // 2
52             s = mid*mid
53             if x == s:
54                 return mid
55             elif x > s:
56                 left = mid + 1
57             else:
58                 right = mid - 1
59         return right
60 
61 """
62 高级解法:牛顿迭代法
63 传送门:https://blog.csdn.net/weixin_42130471/article/details/82730562
64 r[i] = r[i-1]/2+x/r[i-1]/2
65 """
66 class Solution4:
67     def mySqrt(self, x):
68         r = x
69         while r*r > x:
70             r = (r + x//r) // 2 #!!!牛顿迭代方程
71         return r

 

posted @ 2020-02-12 22:32  yawenw  阅读(237)  评论(0编辑  收藏  举报