📑 题目:69. Sqrt(x)

简单 🕓 2021-10-09 📈 频次: 73

**

🚀 本题 LeetCode 传送门

题目大意

实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

解题思路

  • 题目要求求出根号 x

  • 根据题意,根号 x 的取值范围一定在 [0,x] 之间,这个区间内的值是递增有序的,有边界的,可以用下标访问的,满足这三点正好也就满足了二分搜索的 3 大条件。所以解题思路一,二分搜索。

  • 解题思路二,牛顿迭代法。求根号 x,即求满足 x^2 - n = 0 方程的所有解。

    img

代码

  1. package leetcode
  2. // 解法一 二分, 找到最后一个满足 n^2 <= x 的整数n
  3. func mySqrt(x int) int {
  4. l, r := 0, x
  5. for l < r {
  6. mid := (l + r + 1) / 2
  7. if mid*mid > x {
  8. r = mid - 1
  9. } else {
  10. l = mid
  11. }
  12. }
  13. return l
  14. }
  15. // 解法二 牛顿迭代法 https://en.wikipedia.org/wiki/Integer_square_root
  16. func mySqrt1(x int) int {
  17. r := x
  18. for r*r > x {
  19. r = (r + x/r) / 2
  20. }
  21. return r
  22. }
  23. // 解法三 Quake III 游戏引擎中有一种比 STL 的 sqrt 快 4 倍的实现 https://en.wikipedia.org/wiki/Fast_inverse_square_root
  24. // float Q_rsqrt( float number )
  25. // {
  26. // long i;
  27. // float x2, y;
  28. // const float threehalfs = 1.5F;
  29. // x2 = number * 0.5F;
  30. // y = number;
  31. // i = * ( long * ) &y; // evil floating point bit level hacking
  32. // i = 0x5f3759df - ( i >> 1 ); // what the fuck?
  33. // y = * ( float * ) &i;
  34. // y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
  35. // // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
  36. // return y;
  37. // }