letecode [69] - SQRT(X)

実装  int sqrt(int x)

計算の平方根を返す  X、  xは  非負の整数であることが保証されます。

戻り型が整数であるため、小数点以下の桁が切り捨てられ、その結果の整数部のみが返されます。

例1:

入力:4 
出力:2

例2:

入力:8 
出力:2 
説明:8の平方根は2.82842で...、そして以来、
             小数部分は切り捨てられ、2が返されます。

効果の件名:

  xが求めている所定の非負整数xの平方根

理解:

  方法の一つ:I = 1からの暴力行為は、私は条件を満たし見つけ、振り返って開始します。<= X &&(I + 1)*(I + 1)> X iはi *が満たすべき

      しかしながら、このような欠点がある、すなわち、私はINT_MAXを超える*。これは、x / I> = iは&& X /(I + 1)<(i + 1)のように書かなければなりません

      この方法の効率は非常に低く、特にとき大きなX。

  方法2:方法と同様の二分法により、条件を満たした平方根の半ばを見つけます。

      最初の区間[0、X]:中間値の中間部、

        X /ミッド<中期、中期、右の間隔

        X /ミッド=半ばには、半ばは、xの平方根である場合には

        場合X /ミッド>中間、か否かを判定するX /(中間+ 1)<(中間+ 1)、X満たす中間の平方根を、そうでない場合、左ミッド間隔

        現在の中間中間部分の値を更新しました。効率が大幅に良いです。

コードC ++:

  この方法の一つ:

クラス解決{
 パブリックINT mySqrt(INT X){
         もし(x == 0 || X == 1リターンX。
        
        以下のためにint型 i = 1 ; iが<= X / 2 ; ++ I){
             場合(X / iは> = iはX /(iは+ && 1)<(iは+ 1 ))
                 リターンI。
        } 
        戻りX; 
    } 
}。

  方法2:

クラス解決{
 パブリックINT mySqrt(INT X){
         もし(x == 0 || X == 1リターンX。
        INT =左0、右= X、ミッド= X;
        しながら、(左<= 右){ 
            半ば =(左右)/ 2 + 左右。
            もし(X /ミッド< MID){  = ミッド。
            } そう であれば(X /ミッド== MID){
                 リターン中間と、
            }{
                 場合(X /(中間+ 1)<(中間+ 1 ))
                     リターンミッド。 = 半ば; 
            } 
        } 
        戻りX; 
    } 
}。

結果:

  方法:とき実行:240  MSのメモリ消費量:  8.3メガバイト

  方法2:実行:  0 MSの  メモリ消費量:  8.3メガバイト

おすすめ

転載: www.cnblogs.com/lpomeloz/p/10983097.html