Leetcode 69. SQRT(x)は簡単
https://leetcode.com/problems/sqrtx/
実装 int sqrt(int x)
。
計算の平方根を返す X、 xは 非負の整数であることが保証されます。
戻り型が整数であるため、小数点以下の桁が切り捨てられ、その結果の整数部のみが返されます。
例1:
入力:4 出力:2
例2:
入力:8 出力:2 説明:8の平方根は2.82842で...、そして以来、 小数部分は切り捨てられ、2が返されます。
分析:
整数へleetcodeにすることなく、精度、および出力(実際には、あまり精度として使用することができます)。
二分法:()
この質問のために、最も直感的な方法は、二分法です。二分法を使用している場合、我々は後に前を指して、3つのポインタがあります注意してください(前、中、最後に、感謝書き込み習慣、上、一般的に左、中で、右の表現、またはスタート、途中、終わりを使用します)。また、サイクル条件の終わりはまた、あなたが良いプログラムを書く前に、当然のことながら、これはまた、この問題の難しさだと思うする必要があります。
境界条件を決定するには?
サイクルの左端が右、または右と左戻り、左=右=ミッドこの時間に等しい場合、左<右の時間サイクルを仮定する。あなたは、整数の実験を取ることができます例:8のために。
最初のサイクル:
(1 + 8)。MID = / 2 = 4(既定の整数除算は切り捨て)
。MID> 8 / MID
。右MID = - 3 1 =
左1 =
第二サイクル:
MID =(1 +。 3)= 2/2
MID <8 / MIDは
= MIDを残した。1 + 3 =
3 =右
この時間を、左ので==右ループのリターンのうち3であるが、これは正解であってはなりません。ループ条件は、に等しい場合に加えて、即ち、左<=右、次いで、次のサイクルが存在することになる。
第3サイクル:(新)
MID 3 =。
MID> 8 / MID。
右MID = - = 2 1
左= 3
この場合には、サイクルの> RIGH左端。私はあなたへの書き込み、私たちが見つかりました。そのサイクルの終わりに、この例では、リターンが右より適切である場合。これがケースであるか、あなたはこれを好きですか?
例えばX = 10の場合、プロセスは、中間変更されます:> 3 5-> 2-、この時点で10/3 == 3は、直接返します。X = 11の別の例では、プロセスは半ばを変更します:5->> 3 2-、11/3 == 3この時、直接返します。
X = 12の別の例は、プロセスは、中間を変更します:6-> 3-> 4(4 =左この場合、右= 5) - > 4(左= 4、右= 4) - > 右-1ケース、右= 3、4 =左となり、右返します。
したがって、戻り値は正しいであろう(MID下==非存在下でのX / MID)
、あなたはそれを考えることができる理由については、私は理論的な説明与えられ、理解することが考え。平方根に直感的な感覚を切り捨て、およびリターン右、右、<ただ切り捨てされるように、残されています。
注意:部門の書面の理由を、二つの大きな数字、超簡単メモリを掛ける場合ので。
INT mySqrt(INT X){ int型左= 1 ; // 0にすることはできません左、次に、X = 1、(+ 0 1)0/2 = 0、中間の結果が等しい場合、時間分割を行うためにので与えられ INT右= X、 一方(左<= 右){ // INT半ば=(左+右)/ 2; - >大右、左場合+右の最大の整数を超える可能性があるため、そう書かれていない INTミッド= +左(右-左)/ 2; IF(X == MID / MID){ 戻りMIDを; } そう IF(MID> X / MID){ 右 = MID - 1 ; } 他 { // ミッド<X /ミッド 左=ミッド+ 1 。 } } 戻す権利。 }
方法二:(ニュートン法)
ここではニュートン法/ニュートン反復法。導出を理解するために、ニュートン法丸暗記式を使用しないでください。ニュートン法は、近似式の根を見つけるために使用されます。最初の数Fを見つけるために、テイラー級数のF(X)を使用して(X)=ルートの0。(差があるとニュートン法を使用しxgboost何、考えて)
このシリーズについて:(テイラーは)よく言いました
https://baike.baidu.com/item/%E6%B3%B0%E5%8B%92%E7%BA%A7%E6%95%B0
https://zh.wikipedia.org/wiki/%E6%B3%B0%E5%8B%92%E7%BA%A7%E6%95%B0
ニュートンの法則/ニュートン反復法について:
https://baike.baidu.com/item/%E7%89%9B%E9%A1%BF%E8%BF%AD%E4%BB%A3%E6%B3%95 (ウィキペディアはグレートを記述)
https://www.zhihu.com/question/20690553
https://www.cnblogs.com/wangkundentisy/p/8118007.html
(ニュートン反復法は、ルート変換を行った後、主要な問題を説明し、その後、x軸と接線との交点を見つけ、そしてここで反復更新ルート/ゼロに適し、かつ以下の最適化アルゴリズムは同じではありませんの)
https://blog.csdn.net/google19890102/article/details/41087931
(最適化アルゴリズムとしてニュートン法は、全体的なアイデアは、反復点を使用することである)(勾配での一次導関数及び二次導関数(ヘッセン行列)ガイド目的関数をほぼ二次関数であり、新しい二次モデルとして最小点点反復、及び、決定近似最小値は精度を満足するまで、このプロセスを繰り返す。機能とXGBoost二次テイラー展開のこの損失は、同じ原理であり、目的関数とF_T-1(X)ニュートン法を使用するように、一次導関数を求めるとXGBoost、紙と、このブログと連動してリーフノード重みの次の更新で得られF_T-1(X)またはw_q(X)です。それが理解するのは非常に簡単です、それは)何度も何度も見て価値があります
なぜ最適化と応援はニュートンの法則と呼ばれますか?明らかに応援して問題をゼロ、それは(私は突然光を参照してください)Baiduの百科事典「答え」を見て、明らかに無テイラー展開ああ接線まあ、次のとおりです。
注キーワード:方程式、テイラー級数、直線部分を取って、近似式。
以下の詳細な分析を行う、(ハンドアプリ導出処理によって)誘導された反復関係、及びコードを与えます。
要約:
私たちは、上記の分析、ニュートン法から見ると接線法による漸化式が同じで来ることができる、してみましょう接線法はニュートン法の幾何学的表現と考えることができます。
この場合、いわゆるニュートン法は、もはや私には神秘的ではありませんので、私はあまりにも、あなたを願っています!
int mySqrt(int x) { long long ans = x; while (ans * ans > x) { // 其实,我很疑惑:如果ans很大的情况下,ans*ans不应该会报错吗 ans = (ans + x / ans) / 2; // 由公式化简得来 } return ans; }
至此,Leetcode上的这道 “Easy” 题目已经解决。但是往往在面试或实际问题中,要求最后得到的结果具备一定精度,即ans*ans - x < ε。此外,如果要求 ans值满足某一精度,我们就必须使用sqrt()求出其真实开根号值,然后作为判断条件。下面对一种进行代码书写,整体思路和不带精度相同,但是要注意需要把int型转为double型!
二分法:
double mySqrt(double x, double epsilon) { double left = 1.0; double right = x; double mid = left + (right - left) / 2; while (fabs(mid * mid - x) > epsilon) { // 默认mid * mid不会超过范围,否则这道题就麻烦了 if (mid * mid > x) { right = mid; } else if (mid * mid < x) { left = mid; } else { returnミッド; } ミッド =左+(右-左)/ 2 。 } を返す半ばを。 }
ニュートン法:
ダブル mySqrt(デュアル X、ダブルイプシロン){ ダブル年=のX; 一方、 - (X)>ファブ(年年* {イプシロン) 年 =(X +年/年)/ 2 。 } 戻り年。 }
注意:
数学表記の知識イプシロン:のような、ε