滞在ボタン75--色分類

オリジナルタイトル

、赤、白、青、合計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消費量:この結果は、それがあまりいない最適化のように感じるが、私たちのために、最も重要なのは、問題解決のアイデアの増加です。

概要

この質問は、あなたが理解していれば、私は知らない、私の答えプロセスを上回っています。この質問は主に利用指针スキャン、最適化問題解決の成果の上に。

公共の数、見出し番号を私のブログを訪問するか、私に従うことができます興味を持っている、多分驚きがあるでしょう。

https://death00.github.io/

公開番号:建チェンロード

おすすめ

転載: www.cnblogs.com/death00/p/12094989.html