問題のブラシの過程では、二分法または残業の多い、時にはあなたは、多くの場合、二分法を費やすことはありません、今日私が持つの下で最大3つの小さな要約が来たバイナリ検索。
まず、目標値は、検索の数に等しく、
これは、例えば、配列ARR = {1、2、5、6、9}、我々は= 3 I 6添え字を返すために必要この時点で我々の目標数の目標= 6検索戻り、最も単純なタイプです。コードは以下の通りです
int binarySearch(int[] arr, int target){
int left = 0, right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else return mid;
}
return -1;
}
しかし、これは注目すべきポイントは、多くの人々、半ばを求めて、そしてが書き込むことであり
mid = (left + right) / 2;
実際には、この書き込みは、小さな問題で、左が+右数値のオーバーフローにつながる可能性があるため、その中のミスで計算し、それほど頻繁に注意を払うように小さなパートナーのように書かれ、厳格な文言は次のように記述する必要があります。
mid = left + (right - left) / 2;
第二に、以上の数の最初のターゲットを見つけます
数が最初のターゲットよりも小さくない見つけ、私はこの種の出現頻度が最も高いと思いますが、また、目標数は必ずしも配列に表示されないことに注意すること。
例えば、アレイは、ARR = {1、2、5、6、9}目標= 6の、目標数、我々は、I = 4添字を返したいです。
別の例ARR = {0、1、2、2、2、3}、ターゲット= 2。私たちは、I = 2に戻りたいです。
コードは以下の通りです
int binarySearch(int[] arr, int target){
int left = 0, right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] < target) {
left = mid + 1;
}else{
right = mid;
}
}
return right;
}
1理由として、右=半ばになり - のコードでは、最初との最大の違いは、右= MIDがありますか?自分の脳を作る、私はちょうどライン上でシミュレーション上で引用例を見つけます。
はい、そこにあると最初の目標値を見つけるの数以上である同様の問題、される最後の番号を探している目標値未満です。その上1 -それは非常に単純な、直接戻りそうです。
第三に、最初の数が目標値よりも大きい見つけます
最初の数が目標よりも大きい見つけ、私はこの種の出現頻度が最も高いと思いますが、また、目標数は必ずしも配列に表示されないことに注意すること。
例えば、アレイは、ARR = {1、2、5、6、9}目標= 6の、目標数、我々は、I = 5のインデックスに戻りたいです。
別の例ARR = {0、1、2、2、2、3}、ターゲット= 2。私たちは、I = 5に戻りたいです。
コードを見てみましょう
int binarySearch(int[] arr, int target){
int left = 0, right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] <= target) {
left = mid + 1;
}else{
right = mid;
}
}
return right;
}
そこ木製で、コードの第二のタイプのようなあまり感じられ、そしてそれだけではif文ARR [中期] ARR [中期]に<ターゲットを必要とする<=ターゲットとすることができます。なぜに関しては?ため未満ではないのと、第一以上一方と同じ意味が、この問題は最初のものはより大きい含まない、等しい場合ああ。したがって、<、<=に関する。
概要
実際には、二分法を見つけるために、多くの種類があり、しかし、コード差が大きくない、それが変更以上が存在し得るということです。左/右=ミッド+ 1は、左/右=中旬になります。だから、時には間違いを犯すことは非常に簡単で、特にとき彼の心の混乱で、私がここに持っていることが推奨されますが、好きなコードスタイルを選択し、あなたのテンプレートコードで毎回、その後、時間の問題、心のシェアを。
もちろん、私は上記の言った、これらの3つはまだ、いくつかのより多くの困難があり、ターゲットは動的に比較的簡単に更新することができるされており、アップデートは左右もより複雑であるが、このために、一般的にはハードleetcodeあります対象のレベル。そこで、私たちはマスターするために、3つすべてを置くことができますが、あなたが質問をするとき、上記の、そしてあなたも二分法を行うために使用することができます考慮していない質問のどのような直接的な発言権を持っていないので、通常は疑問行いますとき、あなたはもっと注意を払うことができます。
収穫を見て?だから、私は古い鉄の三連勝単式ことを願って与えます
1、親指、より多くの人々が記事を参照できるように
、私の元の番号「に2、世間の注目をハードコード農家を強制的に私の記事を読むために、最初の時間を」。いいえ公共舞台裏返信しない「電子書籍あなたの電子書籍のギフトパッケージを送信するために」。
図3は、また、私のブログには、ああ注目を歓迎しました
著者の情報
著者:ハンサム、書き込みを愛する男
、元のパブリック番号:「ハードコード農家を強制的に」書き込みアルゴリズムに焦点を当て、150件の以上の記事を書くためには、基本的なコンピュータの知識は、あなたの記事の内部強度を向上させるあなたの注意を楽しみにします。返事は「電子」バック公衆あなたの電子書籍のギフトパッケージを送信しません。
転載説明:ソースを示すようにしてください(注意:パブリック数から:ハードコード農家を強制するために、著者:ハンサム大地)