75. Sort Colors

1.問題

  • 給予n個物件, in-place sort讓同樣顏色的排在一起

2.想法

  • 提問:

  • function header, parameter

  • test input

  • 說明想法

    • 1.用一個vector記數0 ~ 2出現的次數, 再重填回去

    • 2.用頭尾指針標示下一個red, blue應該交換的位置

      • 2被0換走後, 有可能是0(0不能在中間), 需要再次檢查

      • 0被換走, 只會是最大的

  • 測試計算複雜度

3.程式碼

  • 方法1

class Solution {
public:
    void sortColors(vector<int>& nums) {
        if (nums.size() == 0) {
            return;
        }
        
        int N = nums.size(), index = 0;
        vector<int> cnt(3, 0);
        
        for (int i = 0; i < N; i++) {
            cnt[nums[i]]++;
        }
        
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < cnt[i]; j++) {
                nums[index++] = i;
            }
        }
    }
};
  • 方法2

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int red = 0;
        int blue = nums.size() - 1;
        for (int i = 0; i <= blue; i++) {
            if (nums[i] == 0) {
                swap(nums, i, red++);
            } else if (nums[i] == 2) {
                swap(nums, i, blue--);
            }  
        }
    }
private:
    void swap(vector<int>& nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    } 
};

Last updated