-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSqrt.java
More file actions
45 lines (38 loc) · 1.16 KB
/
Copy pathSqrt.java
File metadata and controls
45 lines (38 loc) · 1.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Implement int sqrt(int x)
// See: https://leetcode.com/problems/sqrtx/
package leetcode.math;
public class Sqrt {
/**
* Use the Newton's method for finding root
* x^2 - a = 0, f(x) = x^2 - a
* x_(n+1) = x_n - f(x_n)/f'(x_n)
* In our case: x_(n+1) = x_n - (x_n^2 - a)/2*x_n
* x_(n+1) = (x_n^2 + a) / 2*x_n
*/
public int mySqrt(int x) {
double curr = 1;
while (true) {
curr = (curr * curr + x) / (2 * curr);
if ((long) (curr * curr) <= x)
break;
}
return (int) curr;
}
public int mySqrt_slow(int x) {
long sqrt = 1;
while (sqrt * sqrt <= x / 2) {
sqrt++;
}
return (int) sqrt - 1;
}
public static void main(String... args) {
Sqrt sln = new Sqrt();
System.out.println(sln.mySqrt(0)); // 3
System.out.println(sln.mySqrt(4)); // 2
System.out.println(sln.mySqrt(8)); // 2
System.out.println(sln.mySqrt(9)); // 3
System.out.println(sln.mySqrt(16)); // 3
System.out.println(sln.mySqrt(17)); // 3
System.out.println(sln.mySqrt(2147395600)); // 3
}
}