免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
前提バイナリ検索:
シーケンスは、あなたがソート順序、その後、バイナリ検索を与える必要があります無秩序な場合は、注文された見つける必要があります。
バイナリサーチの成功三つのステップ:
- 1)前処理:シーケンスがソートされていない場合は、最初の並べ替え
- 2)バイナリ検索:ループまたは再帰中間要素値を用いては、2つのサブインターバルに間隔内の一の部分区間を見つける、ターゲット要素に比べて、サイクル又は再帰の終了まで、修飾されています。
- 3)アフタートリートメント:サイクルが完了または再帰した後、素子の残りのゾーンの要素を決定するのに必要な条件を満たしています
テンプレート1:
int binarySearch(vector<int>& nums, int target)
{
if(nums.size() == 0) return -1;
int left = 0, right = nums.size() - 1;
while(left <= right)
{
// Prevent (left + right) overflow
int mid = left + (right - left) / 2;
if(nums[mid] == target){ return mid; }
else if(nums[mid] < target) { left = mid + 1; }
else { right = mid - 1; }
}
// End Condition: left > right即left=right+1
return -1;
}
テンプレート1キー属性:
- 1)バイナリ検索テンプレート1は、最も基本的かつ最も基本的な形式であります
- 2)要素を見つける両側の要素を決定するために比較することができない、すなわち、左右に最大=半ば1、右に見て左=ミッド+ 1
- 3)後処理のため、ループの後、必要とされない、区間0の要素数
構文の違い:
- 1)の2つのパーティション間[0、サイズ1]
- 2)左及び右のアップ=ミッド1;ミッド+ 1 =左を検索
- 3)エンドサイクリング条件:左>右1 +右=すなわち、左
テンプレート2:
int binarySearch(vector<int>& nums, int target)
{
if(nums.size() == 0)
return -1;
int left = 0, right = nums.size();
while(left < right)
{
// Prevent (left + right) overflow
int mid = left + (right - left) / 2;
if(nums[mid] == target){ return mid; }
else if(nums[mid] < target) { left = mid + 1; }
else { right = mid; }
}
// Post-processing:
// End Condition: left == right
if(left != nums.size() && nums[left] == target) return left;
return -1;
}
テンプレート2キー属性:
- 1)テンプレート2は、アレイにアクセスするための必要性を見つけるために使用され、検索する二分法高度な方法である
当前索引
と其直接右邻居索引
要素または条件(中間中間要素を、我々は素子の中間点を決定する必要がないだけの条件を満たし、我々はまた、右の中間を決定するために必要隣接要素条件かどうか:要素と右隣の要素中旬+ 1の中間点あれば条件を満たすために、我々は左のみ半ばの要素を決定する必要があり、右の右境界サブインターバルを見つけるために、次回は半ばであるので、うまく条件を満たしています中旬に残された条件が満たされていない要素の中間点ならば、我々はまた、条件が満たされているかどうか、右隣の要素ミッド+ 1を決定する必要があり、我々は=左、右を探し半ば+ 1;要素の代表者、つまり、右=ミッド右隣の要素)- 2)セクションの少なくとも二つの要素の範囲を見つけます
- 3)処理する必要があるが、ループ条件の端部が同じ要素についてです=右の境界点を残している、私たちは、この要素の規定の対象かどうかを決定するために必要
構文の違い:
- 1)の2つのパーティション間[0、サイズ)
- 2)左側を探す:右=半ば、右見て左=ミッド+ 1
- サイクリング条件3)末端:左=右
テンプレート3:
int binarySearch(vector<int>& nums, int target){
if (nums.size() == 0)
return -1;
int left = 0, right = nums.size() - 1;
while (left + 1 < right)
{
// Prevent (left + right) overflow
int mid = left + (right - left) / 2;
if (nums[mid] == target) {return mid;}
else if (nums[mid] < target) {left = mid;}
else {right = mid;}
}
// Post-processing:
// End Condition: left + 1 == right
if(nums[left] == target) return left;
if(nums[right] == target) return right;
return -1;
}
テンプレート3キー属性:
- 1)テンプレート半分3は見つけるためのもう一つのユニークな方法ですが、それは現在のインデックスへのアクセスを必要とする配列(半ば中間要素内の要素や条件指数についてそのすぐ隣を見つけるために使用される、我々は条件の中かどうかを判断する必要があるだけでなく、だけでなく、条件かどうか隣人の半ばを決定する必要があります半ばには条件を満たすことがあれば、我々はまた、ミッド右=ミッドその条件を満たして左隣の要素を決定する必要があり、ミッド条件が満たされない場合は、その後、我々はまた、ミッド隣人の権利を決定する必要があります要素が条件を満たしている、すなわち、左= MID)
- 2)少なくとも三つの要素を含むセクションを探します
- 3)必要が処理される、サイクリング条件の端部は、左+ 1 =右、我々は、目標値に向けられ、左右の要素を決定する必要が
構文を区別:
- 1)の2つのパーティション間[0、サイズ1]
- 2)左に見つけること:右=半ば、右側に見る:左=中旬
- サイクリング条件3)末端:左+ 1 =右
二分法演習:
タイトル | 問題の解決策 | 難しさ |
---|---|---|
4. 2つの注文の配列の中央値を探して | C ++ | ハード |
33件の検索回転ソートされた配列 | C ++ | 中 |
34.最初と最後の位置にソートされた配列の要素を探します | C ++ | 中 |
50.パウ(X、N) | C ++ | mdium |
69. X平方根 | C ++ | イージー |
153は、ソートされた配列の回転の最小値を探します | C ++ | 中 |
154は、ソートされた配列は、IIを回転さの最小値を探します | C ++ | ハード |
162見るとピーク | C ++ | 中 |
278最初の間違ったバージョン | C ++ | イージー |
287は、繰り返し回数を見つけます | C ++ | 中 |
209サブアレイの最小長さ | C ++ | 中 |
2つの配列の349交点 | C ++ | イージー |
350交差点IIの二つのアレイ | C ++ | イージー |
367.効果的な完璧な正方形 | C ++ | イージー |
374ゲスサイズ | C ++ | イージー |
410ストライプアレイの最大値 | C ++ | ハード |
一緒に454の4つの数字II | C ++ | 中 |
658 Kに最も近い要素が見つかりました。 | C ++ | 中 |
704バイナリ検索 | C ++ | イージー |
719 kに小さな距離を特定します | C ++ | ハード |