69. xの平方根:
負でない整数 を指定すると、の算術平方根をx
計算して返します。x
戻り値の型は整数であるため、結果の整数部分のみが保持され、小数部分は破棄されます。
注pow(x, 0.5)
: 組み込みの指数関数や演算子 (または など) は使用できませんx ** 0.5
。
例 1:
输入:
x = 4
输出:
2
例 2:
输入:
x = 8
输出:
2
解释:
8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
ヒント:
- 0 <= x <= 2 31 - 1
分析します:
- このアルゴリズムの問題に直面して、二代目リーダーは再び考え込んでしまいました。
- 平方根は必要ですが、組み込みの指数関数は許可されていません。これは私にとって意図的に難しいものです。
- ブルートフォースクラッキングは、とにかく、1 から x までの整数を 1 つずつ試して、最も近い解決策を見つけることができます。非常に簡単ですが、単純すぎるため、もっと良い方法があるはずです。
- 答えは整数で十分です 線形連続値から最適値を見つけます 二分法を使えば良いと思いますので、続けてみましょう 二分法の効率は非常に高く、データ量は半分に削減できます毎回、それはもう満足です。
- もっと良い方法があります。答えは近似整数である必要があるため、近似解を効率的に求めるのに非常に適したニュートン反復法を使用することもできます。効率はバイナリ スコアよりも高いと言われています。
- 数学は依然として非常に強力であると感じています。数学的手法を使用すると、多くのことが効率的に解決できます。コンピューターはすでに非常に高速ですが、多くの場合、数学的手法を使用するとはるかに速く解決できます。私は数学をしっかり学びたいと思っています。
- 以下の問題の解法はすべてニュートン反復法を使用して近似解を求めるため、次数、つまり続行を停止するポイントが必要です。一般に、連続して得られる 2 つの解の差が非常に小さい場合、次の解が得られると考えられています。停止する時間です。
答え:
さび:
impl Solution {
pub fn my_sqrt(x: i32) -> i32 {
if x == 0 {
return 0;
}
let (c, mut x0) = (x as f64, x as f64);
loop {
let xi = 0.5 * (x0 + c / x0);
if (x0 - xi).abs() < 1e-7 {
break;
}
x0 = xi;
}
return x0 as i32;
}
}
行く:
func mySqrt(x int) int {
if x == 0 {
return 0
}
c, x0 := float64(x), float64(x)
for {
xi := 0.5 * (x0 + c/x0)
if math.Abs(x0-xi) < 1e-7 {
break
}
x0 = xi
}
return int(x0)
}
c++:
class Solution {
public:
int mySqrt(int x) {
if (x == 0) {
return 0;
}
double c = x, x0 = x;
while (true) {
double xi = 0.5 * (x0 + c / x0);
if (fabs(x0 - xi) < 1e-7) {
break;
}
x0 = xi;
}
return int(x0);
}
};
パイソン:
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0:
return 0
c, x0 = float(x), float(x)
while True:
xi = 0.5 * (x0 + c / x0)
if abs(x0 - xi) < 1e-7:
break
x0 = xi
return int(x0)
ジャワ:
class Solution {
public int mySqrt(int x) {
if (x == 0) {
return 0;
}
double c = x, x0 = x;
while (true) {
double xi = 0.5 * (x0 + c / x0);
if (Math.abs(x0 - xi) < 1e-7) {
break;
}
x0 = xi;
}
return (int) x0;
}
}
この記事を読んでいただきありがとうございます〜
[いいね][お気に入り][コメント]へようこそ 3回連続で行きましょう〜
諦めるのは難しいことではありませんが、それはクールでなければなりません〜
みんなで毎日少しずつ成長できれば幸いです~この記事は二代目マスターのホワイトハット
が書いています:https://le-yi.blog.csdn.net/ブログ原文~