問題
Implement int sqrt(int x).
Compute and return the square root of x, where x is guaranteed to be a non-negative integer.
Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.
复制代码
翻訳:
達成int型のsqrt(int型x)です。計算し、xが保証非負整数であるxの平方根を返します。戻り型は、整数、小数トランケートであり、唯一の整数部分を返すからです。実施例1:入力:出力4:2例2:入力:出力8:2説明:2.82842 8の平方根である...、小児期の数は2を返さ、遮断されます。
問題解決のためのアイデア
この質問は、それは10進数の場合、戻り値は、小数点以下を破棄され、数の平方根は現在の数で見つけることです。私たちは、その後、ここで、結局、数の平方根の上限の範囲外に描画することができ、あなたはこの問題を回避することができ懸念ではないかもしれないが、実際には、国境を越えた問題を考慮する必要があり、裁判官への道ではありません横切ることができます。トラバースに加えて、我々はまた、解決するために、組み込みのJava Mathクラスを使用することができ、最も簡単です。また、この質問には、値を見つけることですが、特定の範囲内の値を探している、あなたは簡単なクエリ時間を二分法を使用できるかどうかを考えることができます。
問題解決のアプローチ
-
次のようにコードを編集するために私たちの考えによると、
if (x <= 0) { return 0; } for (int i =x/2+1; i>=0; i=i/2) { long result = 1L*i * i; if (result == x) { return i; } if (result > x) { return i - 1; } } return 0; 复制代码
時間複雑:そのF(N)は循環mのプログラム=(N / 2)= N; そうO(F(N))= O(N / 2)、 すなわち、T(N)= O(N )
空間複雑:スペースの複雑さはO(N)= O(1となるようにプログラムが余分なスペースを使用するが、使用されていません )。
-
次のように、二分法を用いて
if (x <= 0) { return 0; } int start = 0; int end = x; while (start <= end) { int index = (start + end) / 2; long sum = 1L * index * index; if (sum > x) { end = index - 1; } else { start = index + 1; } } return end; 复制代码
時間複雑:mのプログラムサイクル(N)=(LOGN)Fそう = N; そうO(F(N))= O(LOGN)、 即ち、T(N)= O(LOGN )
空間複雑:スペースの複雑さはO(N)= O(1となるようにプログラムが余分なスペースを使用するが、使用されていません )。
-
以下のように数学のクラスボロー、
if (x <= 0) { return 0; } return (int)Math.sqrt(x); 复制代码
時間複雑:mのプログラムサイクル(N)Fそう=(1) = N; そうO(F(N))= O(1)、 即ち、T(N)= O(1 )
空間複雑:スペースの複雑さはO(N)= O(1となるようにプログラムが余分なスペースを使用するが、使用されていません )。
概要
特に範囲ではなく、順番に上記の苦情として、この問題の近似解、私たちは自然にトラバーサルを簡素化する二分法を考え、この質問は、最近必要とされたので、最低限、上のようend--、大きな値最低限、ちょうど良い出会いになります。
ます。https://juejin.im/post/5cfa8a2e6fb9a07efb69777dで再現