leetcode 75.颜色分类

leetcode 75.颜色分类

题目描述

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意:
不能使用代码库中的排序函数来解决这道题。

示例:

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

解题思路

方法一:两趟遍历法

给定的数组中只包含0,1,2三个数字,通过一次遍历把数组中每个数字的数量统计出来,然后二次遍历按照统计的数量把0,1,2依次填入数组中。

class Solution {
public:
    void sortColors(vector<int>& nums) {
        vector<int> colors(3, 0);    // 记录每个颜色出现的次数
        for(int i=0; i<nums.size(); i++){  // 一次循环
            colors[nums[i]] += 1;
        }
        // 二次循环,进行排序,按照0,1,2排序
        int index = 0;
        for(int i=0; i<3; i++){
            while(colors[i]){ // 当数字减少到零,表示该颜色填充完毕
                nums[index] = i;
                colors[i]--;
                index++; 
            }
        }
    }
};

方法二:三指针方法

定义三个指针来分别追踪0,1,2这三个数字,left追踪0、cur作为下标的移动(也可以说是追踪数字1),right追踪数字2。定义完了以后,分为三步

  • 当nums[cur] = 0的时候,交换nums[left]、nums[cur],同时left、cur同时向右移动一位
  • 当nums[cur] = 2的时候,交换nums[right]、nums[cur],只把right向左移动一位
  • 当nums[cur] = 1的时候,cur向右移动一位

那么当cur的值大于等于right的时候,遍历完成

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int left=0, cur=0, right=nums.size()-1;   // 定义三个指针
        while(cur<=right){
            int temp = nums[cur];
            if(nums[cur] == 0){				// 等于零的情况,交换,并同时移动left、cur
                nums[cur] = nums[left];
                nums[left] = temp;
                left++;
                cur++;
            }
            else if(nums[cur] == 2){        // 等于2的情况,交换,并移动right
                nums[cur] = nums[right];
                nums[right] = temp;
                right--;
            }
            else{                           // 等于1时,只操作cur向右移动
                cur++;
            }
        }
    }
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

发布了135 篇原创文章 · 获赞 164 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/EngineerHe/article/details/103869510