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