アルゴリズムleetcode|69. xの平方根(サビが激しくなる)



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/ブログ原文~


おすすめ

転載: blog.csdn.net/leyi520/article/details/132203921