leetcode-75.颜色分类


题目详情

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。


示例1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例2:

输入:nums = [2,0,1]
输出:[0,1,2]

我的方法:

利用三个指针来进行一次遍历排序,一个头用来存0,一个尾用来存2,一个遍历
如果遍历到0,则与头交换,2,则与尾交换,否则继续遍历
但是需要注意的是,和尾交换后可能交换过来的还是0或者2,所以这里需要再分两种情况
详情代码:

class Solution 
{
public:
    void sortColors(vector<int>& nums) 
    { int n = nums.size();
      if (n < 2)
      return;

    //三个指针zero头区间,two尾区间,p正在遍历区间
      int zero = 0,two = n - 1,p = 0; 
      while(p <= two)
      {
          if (nums[p] == 0)             //遍历到若是0,则和头交换
          {
            swap (nums[p] , nums[zero]);
            ++zero;
            ++p;
          }
          else if (nums[p] == 2)        //遍历到若是2,则和尾交换
          {
              if (nums[two] == 1)       //这里必须注意,如果交换过来的是1,则不考虑其他
              {
                swap (nums[p] , nums[two]);
                ++p;
                --two;
              }
              else                      //但若是交换过来是0或者2,则不应往下遍历
              {                         //因为0 2还需继续处理
                swap (nums[p],nums[two]);
                --two;
              }
          }
          else                          //遍历到1,直接略过继续遍历即可
          {
             ++p;
          }

      }    
    
    }
};
posted @ 2022-04-05 17:16  ggaoda  阅读(3)  评论(0编辑  收藏  举报  来源