leetcode-色分類(JavaScript)


赤、白、青の合計n要素を含む配列を指定し、同じ色の要素が隣接し、赤、白、青の順に並べ替えます.
この問題では、0、1、2の整数を使用して、赤、白、青をそれぞれ表します.
注意:コードライブラリのソート関数を使用してこの問題を解決することはできません.
例:
  : [2,0,2,1,1,0]
  : [0,0,1,1,2,2]

ステップ:
  • 直感的な解決策は、カウントソートを用いた2つのスキャンアルゴリズムである.まず、0、1、2要素の個数を反復して計算し、0、1、2のソートで現在の配列を書き換えます.
  • 定数空間のみを使用したスキャンアルゴリズムを考え出せますか?

  • 考え方:
    私たちがしなければならないのは最適なアルゴリズムです.他人の考え方も参考にしていますが...
    3つのポインタ、i、j、kを設定し、それぞれ最後の0、1、2の下付きを表す.初期は-1である.
    配列を巡って、配列要素には3つのケースがあります.
    1、要素は0:kで1ビット後ろに移動し、その後、このk上の要素を2、jで1ビット後ろに移動し、その後、このj上の要素を1、iで1ビット後ろに移動し、その後、このi上の要素を0に設定する(k、j、iを移動する順序が間違っていないことに注意).
    2、要素は1:kとjだけ移動する(順序が間違ってはいけないことに注意する)(同時に相応の要素を設定する);
    3、要素は2:kだけ移動し、このkの要素を2に設定.
    /**
     * @param {number[]} nums
     * @return {void} Do not return anything, modify nums in-place instead.
     */
    var sortColors = function(nums) {
      let i = -1, j = -1, k = -1;
      for (let num of nums) {
        switch(num) {
          case 0:
            nums[++k] = 2;
            nums[++j] = 1;
            nums[++i] = 0;
            break;
          case 1:
            nums[++k] = 2;
            nums[++j] = 1;
            break;
          case 2:
            nums[++k] = 2;
            break;
        }
      }
    };