オリジナルタイトル
、赤、白、青、合計n個の配列の要素、in situでそれらをソートし、同じ色を持つように隣接する素子と、赤、白、青の順に配置所与。
この問題は、我々は、赤、白、青を表す0、1、2の整数を使用します。
注意:
あなたはこの質問を解決するために、ソート機能のコードベースを使用することはできません。
例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
高度:
* 一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
* 你能想出一个仅使用常数空间的一趟扫描算法吗?
オリジナルタイトルURL:https://leetcode-cn.com/problems/sort-colors/
問題解決
二回のスキャン
私はその種を考えていた最初のアイデアは、その後、への必要性を感じない3つの要素のみので、私はでき、完全に基づいて进阶
、その後の要素の数、二回目のスキャンの最初のプロンプト、最初のスキャン統計、直接割り当て。
直接コードを見てみましょう:
class Solution {
public void sortColors(int[] nums) {
// 记录0,1,2的个数
int num0 = 0, num1 = 0, num2 = 0;
// 计算各个数字出现的次数
for (int i : nums) {
switch(i) {
case 0:
num0++;
break;
case 1:
num1++;
break;
case 2:
num2++;
break;
}
}
// 重新赋值
for (int i = 0; i < nums.length; i++) {
if (i < num0) {
nums[i] = 0;
} else if (i < num0 + num1) {
nums[i] = 1;
} else {
nums[i] = 2;
}
}
}
}
:によって実行された場合、OK提出0 ms
メモリ35.2 MB
消費量:。また、それを最適化することができますか?
最適化
参考进阶
2番目のプロンプト、上記の方法は、一定のスペースを使用しますが、どのようにそれをスキャンするために、再びそれを行うには?
私は実際には、他の誰かのソリューションへの参照を出たくありませんでした:利用三个指针进行一次遍历并交换
。
具体的には、現在のポインタが増加しcurrent
、(インデックス0から始まる)セクション番号0の末尾を指すポインタp0
(インデックス0から始まる)、開始セグメント番号2を指すポインタp2
(添字nums.length - 1 )。記憶された番号との間の、2 - 0との間の屈折率添字番号0 P0、添字(1 nums.length)にP2との間の格納されたインデックス番号1、P2の添字にP0を格納します。値は2であり、P2が切り替えられた場合、現在のポインタインデックスは、値が0の場合、0トラバーサルから始まり、P0交換。
コードを見てみましょう:
class Solution {
public void sortColors(int[] nums) {
// 利用3个指针current、p0、p2
int current = 0, p0 = 0, p2 = nums.length - 1;
while (current <= p2) {
// 如果当前值为1,current指针往后移动
if (nums[current] == 1) {
current++;
continue;
}
// 如果当前值为0,则和 p0 交换,p0指针往后移动
if (nums[current] == 0) {
nums[current] = nums[p0];
nums[p0] = 0;
// 因为p0一开始和current相同
if (p0 == current) {
current++;
}
p0++;
continue;
}
// 如果当前值为2,则和 p2 交换,p2指针往前移动
if (nums[current] == 2) {
nums[current] = nums[p2];
nums[p2] = 2;
p2--;
continue;
}
}
}
}
:によって実行された場合、OK提出0 ms
メモリ35 MB
消費量:。この結果は、それがあまりいない最適化のように感じるが、私たちのために、最も重要なのは、問題解決のアイデアの増加です。
概要
この質問は、あなたが理解していれば、私は知らない、私の答えプロセスを上回っています。この質問は主に利用指针
スキャン、最適化問題解決の成果の上に。
公共の数、見出し番号を私のブログを訪問するか、私に従うことができます興味を持っている、多分驚きがあるでしょう。
公開番号:建チェンロード