これは、最初の小川である390、最初の更新420ピアン原稿
01の質問と準備ができて見えます
今日導入されLeetCodeのタイトルにアルゴリズムやすいのレベル252の(全体のタイトル番号がある質問1051)。これは、毎年恒例の写真撮影の列を増大させるために、高さで立って、学生が必要です。
学生の数が正しい位置に立っていない返します。(これは、すべての学生が増加する高さの順に配列することができるように移動させなければならない学生の数です。)
例えば:
入力:[1,1,4,2,1,3]
出力:3
説明:学生の高さと、最終的な高さ4,3 1が正しい位置に立っていません。
注意:
1 <= heights.length <= 100
1 <=高さ[I] <= 100
02第一溶液
質問は非常に簡単だった、あなたは駅の高さの順番を増やすことで、学生の数を見つけることができません。
アイデア:元の値を使用して、それらを並べ替え、配列AからコピーされたArrays
クラスのsort
配列要素に対応する元の位置に比べて、次に完了方法、および、インクリメントされる値は1に等しくなく、総数を返します。
時間の複雑さO(N log(N))
、スペースの複雑さO(N)
。
public int heightChecker(int[] heights) {
int count = 0, n = heights.length;
int[] copy = Arrays.copyOf(heights, n);
Arrays.sort(copy);
for (int i=0; i<n; i++) {
if (heights[i] != copy[i]) {
count++;
}
}
return count;
}
03第二の溶液
数日前に覚えているが、それを注文するのカウントを詳しく説明していましたか?この問題は、このソリューションは、実装の簡易版で、過ごすことができます。
時間の複雑さO(N)
、スペースの複雑さO(N)
。
public int heightChecker2(int[] heights) {
int[] count = new int[101];
for (int num : heights) {
count[num]++;
}
int n = heights.length, index = 0;
int[] result = new int[n];
for (int i=0; i<count.length; i++) {
while (count[i] > 0) {
result[index++] = i;
count[i]--;
}
}
int times = 0;
for (int i=0; i<n; i++) {
if (heights[i] != result[i]) {
times++;
}
}
return times;
}
04第三の溶液
アルゴリズムのソート高度なバージョンを数えます。
時間の複雑さO(N)
、スペースの複雑さO(N)
。
public int heightChecker3(int[] heights) {
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int num : heights) {
min = Math.min(min, num);
max = Math.max(num, max);
}
int[] count = new int[max-min+1+1];
for (int num : heights) {
count[num-min+1]++;
}
for (int i=1; i<count.length; i++) {
count[i] += count[i-1];
}
int n = heights.length;
int[] result = new int[n];
for (int j=0; j<n; j++) {
result[count[heights[j]-min]++] = heights[j];
}
int times = 0;
for (int i=0; i<n; i++) {
if (heights[i] != result[i]) {
times++;
}
}
return times;
}
05第溶液
シンプルなバージョンの要素がソートされているときに、我々は、簡素化することができ、ソートアルゴリズムのためのカウントは新しい配列、道は単一のオープンバックする必要性なくし、元の配列の対応する要素と比較され移入for
サイクルの比較を。
時間の複雑さO(N)
、スペースの複雑さO(N)
。
public int heightChecker4(int[] heights) {
int[] count = new int[101];
for (int num : heights) {
count[num]++;
}
int n = heights.length, index = 0;
int times = 0;
int[] result = new int[n];
for (int i=0; i<count.length; i++) {
while (count[i] > 0) {
result[index] = i;
if (heights[index] != result[index]) {
times++;
}
index++;
count[i]--;
}
}
return times;
}
06まとめ
テーマ別のアルゴリズムは、継続的にされている日以上7ヶ月、特集記事のアルゴリズム258件の +記事、公衆番号]ダイアログボックスの返信[ データ構造とアルゴリズム ]、[ アルゴリズム ]、[ データ構造 ]のいずれかの記事のコレクションのシリーズを取得するキーワード。
それは、すべてだあなたは何か良い解決策のアイデア、提案やその他の問題がある場合、あなたは以下のコメントを交換することができ、親指、メッセージ転送およびサポートは、私にとっての最大の報酬です!