英語のドキュメントは、先端が紙に書かれているARTSはパンチの前に、私は毎回アルゴリズムを持っている、これは私には大きな助けですが、読者を与える可能性があり、すべての突然のように多くの入力がある、またはこれは、消化に時間がかかります。
それから私は、現在進行中の各モジュールのセグメンテーション、及びポイントのより詳細な説明を変更し、誰もがより良い通信を行うことができ、より良い特定の詳細を見ていきますので、だけでなく、私たちはより良い彼らが学んだことを消化することができます知識。
そのため、その後のARTSはパンチ、最初のアルゴリズムは、英語では11月に文書を開いて分割しようとし、収穫シーズンは、私たちはより多くの秋の収穫では、上に移動させ、より多くを学びます。あなたと小扁!
アルゴリズムLeetCodeアルゴリズム
配列の並べ替え要素の最初と最後の位置を検索します
(https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
)
説明タイトル:昇順に従って整数NUMSのアレイ、及び目標値目標が与えられます。アレイ内の所与の標的の開始および終了位置を特定します。
アルゴリズムのあなたの時間の複雑さはO(ログn)のレベルでなければなりません。
標的がアレイ内に存在しない場合、戻り[-1、-1]。
例1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
例2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
解決策1:リニアスイープボルタンメトリー
これは、単純な1次元配列であるので、我々は最も愚かな方法は、我々は彼に告げた従来の方法によって横断より自然な表情、実施することであるの配列を見てみたいスキャン線形を。
まず第一に、我々は、入力配列を持つnums
第一の標的デジタルに直面したとき、最初から最後までトラバースされるtarget
トラバーサル時間を中断し、存在する位置を記録すること。あなたは出会いの数字が存在しないターゲットの配列全体を教えていない場合は、すぐに戻りますが、結果はここにある、番号を見つけることができません[-1、-1] 。
前提の最初の数字を見つけるために、我々は最初の目標数値に遭遇すると、それは我々が第二の標的数を必要とすることで、アレイの端部から前方に横断があるので(左端既存ので、存在しなければなりません何のケースが見つからないことができません右端の桁)。
最後に、我々は、出力結果がすることができます。
/**
*
* @Title :
* @Description: 线性扫描
* @param nums
* @param target
* @return
* @return :int[]
* @throws
*/
public static int[] searchRange1(int[] nums, int target) {
int[] range = {-1,-1};
// 从头到尾遍历,先查找左边的元素
for (int i = 0; i < nums.length; i++) {
if (nums[i] == target) {
range[0] = i;
break;
}
}
// 如果左边的元素找到最后也没找到,那么说明数组里不存在此元素,直接返回找不到的结果[-1,-1]
if (range[0] == -1) {
return range;
}
// 从尾到头遍历,继续查找右边的元素
for (int j = nums.length - 1; j >= 0 ; j--) {
if (nums[j] == target) {
range[1] = j;
break;
}
}
return range;
}
対処方法2:バイナリ検索
なぜあなたはそれの半分を見つけることを期待するでしょうか?トピックは説明に与えられているので、我々はすでにソートされた配列は、検索効率を向上させることができる二分法で渡します。
同じことがまた回の線形数に似た方法を見つけるために必要とされるが、今回は多くのことを見つけることができません。まず、左端(または右端の)を見つけるために含まれているtarget
インデックス(というよりも見つけ、その後、リターンをtrue
、我々は見つけるので、)target
ではないすぐに停止ポストを。私たちはまで検索し続ける必要がありlo == hi
、彼らはしているtarget
同じ場所での標準値。
もう一つの変更があるleft
パラメータの導入、それがあるboolean
の顔に変化の方向の種類target == nums[mid]
際に何をすべきか。場合left
でtrue
、我々は再帰クエリ間隔、そうでない場合は右の再帰間隔を残しています。我々が考える場合にマークされ、次i
で出会ったtarget
一番左のは、target
確かに添字より大きくなりませんi
、我々はサブインターバルを検討する権利を持っていることはありませんので、位置。最も右下のためのマークは、同じ原理が適用された場合。
力の参照が問題に正式な解決策をバックル:、https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/zai-pai-xu-shu-zu-zhong-cha-zhao-yuan-su-de-di-yi-/
興味のある学生は、過去の下のリンクを学ぶことができます。
public static int[] searchRange(int[] nums, int target) {
int[] targetRange = {-1,-1};
int leftIndex = searchIndex(nums, target,true);
if (leftIndex == nums.length || nums[leftIndex] != target) {
return targetRange;
}
targetRange[0] = leftIndex;
targetRange[1] = searchIndex(nums, target, false) - 1;
return targetRange;
}
// 遍历左区间或者右区间
private static int searchIndex(int[] nums,int target,boolean left) {
int lo = 0;
int length = nums.length;
while (lo < length) {
int mid = (lo + length) / 2;
if (nums[mid] > target || (left && target == nums[mid])) {
length = mid;
} else {
lo = mid + 1;
}
}
return lo;
}
で、習慣を開発するのに長い時間がパンチすることができ、それを失ってはならない二分法の記事があり問題に、このソリューションでは、システムを説明し、プレゼンテーションを行い、あなたは二分法の深い理解を持つことになります。
だから、小さなまたは、アドレスに投稿されたhttps://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/er-fen-cha-zhao-suan-fa-xi-jie-xiang-jie-by-labula/
ので、我々は下に行くことを学ぶことを、ここに申し訳ありません友人を言うので、ここで、希望の効果を達成するために、間違った記述恐怖のために、詳細には触れませんでした。
長い時間のために書くが、これは「パスを学ぶ」一般公開/コバン/非コバンに適しています
パンチは、長期的な習慣はそれを失うことはありません開発することがあり
決勝でのJava、最終的には、ファイナライズの違いは何ですか?
私はない忍耐力「へのエントリーからあきらめる」にあなたを請います
あなたの小扁厳選されたデザインパターンの本「デザインモード」の贈り物を返信してすぐに戻ってあなたの注意をありがとう、そして「攻城ライオンは、それを実行します」。ロックを解除するために - 「>一緒に学び、私はいじめる」小扁は、高品質の交換基を構築する「プラスグループ」を返信したり、右下隅をクリックします。
ブログ記事複数のプラットフォームからこの記事OpenWriteリリース!