LongDz 的数字文墨提案

75. 颜色分类

3 min

题目

75. 颜色分类 中等

解法:三指针

思路

第一段:使用三指针(low、mid、high)一次遍历完成排序,是经典的荷兰国旗问题解法。

第二段:算法维护四个区间的不变性:[0,low-1]全为0,[low,mid-1]全为1,[mid,high]未处理,[high+1,n-1]全为2。当mid遇到0时与low交换并前移双指针,确保0归位;遇到1时直接跳过;遇到2时与high交换并后移high指针,但不前移mid,因为交换后的元素可能仍是0或1需要再次处理。这种策略保证了每个元素最多被交换两次,且不会错过任何可能的正确位置。

第三段:

  • Step 1: 初始化low=0, mid=0, high=n-1
  • Step 2: 当mid<=high时循环处理
  • Step 3: 若nums[mid]==0,交换nums[low]和nums[mid],low和mid都自增
  • Step 4: 若nums[mid]==1,仅mid自增
  • Step 5: 若nums[mid]==2,交换nums[mid]和nums[high],high自减
  • Step 6: 循环结束,数组排序完成

复杂度

  • 时间复杂度: O(n)O(n)
  • 空间复杂度: O(1)O(1)

代码

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int low = 0;
        int mid = 0;
        int high = nums.size() - 1;

        while(mid <= high){
            if(nums[mid] == 0){
                swap(nums[low], nums[mid]);
                low++;
                mid++;
            }
            else if(nums[mid] == 1){
                mid++;
            }
            else{
                swap(nums[mid], nums[high]);
                high--;
            }
        }
    }
};