zoukankan      html  css  js  c++  java
  • Sqrt(x) 解答

    Question

    Implement int sqrt(int x).

    Compute and return the square root of x.

    Solution 1 -- O(log n)

    常规做法是用的binary search。注意这里mid一定要是long类型,否则mid * mid会溢出。

     1 public class Solution {
     2     public int mySqrt(int x) {
     3         // Use long instead of int
     4         long start = 1, end = x, mid;
     5         while (start + 1 < end) {
     6             mid = (end - start) / 2 + start;
     7             long tmp = mid * mid;
     8             if (tmp == x) {
     9                 return (int) mid;
    10             } else if (tmp < x) {
    11                 start = mid;
    12             } else {
    13                 end = mid;
    14             }
    15         }
    16         if (end * end <= x)
    17             return (int) end;
    18         return (int) start;
    19     }
    20 }

    Solution 2 -- Constant Time

    我们可以通过以下数学公式缩小问题规模:

    因此,问题转换成如何求 log2N

    注意到对于任何数,它的binary representation可以表示为Σ2i

    所以 log2N 的取值范围为[i, i + 1] i 为最高位的位数。

    因此我们就缩小了二分查找的范围。

     1 public class Solution {
     2     public int mySqrt(int x) {
     3         int num = x, digit = 0;
     4         while (num > 0) {
     5             num = num >> 1;
     6             digit++;
     7         }
     8         int candidate1 = (int) Math.pow(2, 0.5 * digit);
     9         int candidate2 = (int) Math.pow(2, 0.5 * (digit - 1));
    10         long start = candidate2, end = candidate1, mid;
    11         while (start + 1 < end) {
    12             mid = (end - start) / 2 + start;
    13             long tmp = mid * mid;
    14             if (tmp == x)
    15                 return (int) mid;
    16             if (tmp < x)
    17                 start = mid;
    18             else
    19                 end = mid;
    20         }
    21         if (end * end <= x)
    22             return (int) end;
    23         return (int) start;
    24     }
    25 }
  • 相关阅读:
    Ubuntu安装gfortran
    Ubuntu12.04安装vscode i386
    PowerShell让系统可以执行.ps1文件
    Gitlab. Disable user creation on welcome page
    开源项目和工具列表
    布隆过滤器 (Bloom Filter)
    信息系统综合知识概览
    Hadoop实战之四~hadoop作业调度详解(2)
    Hadoop实战之三~ Hello World
    Hadoop实战之二~ hadoop作业调度详解(1)
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4916236.html
Copyright © 2011-2022 走看看