leetcode刷题----75. 颜色分类 C++实现

题目

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

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

  • 示例:
    输入: [2,0,2,1,1,0]
    输出: [0,0,1,1,2,2]

  • 进阶:
    一个直观的解决方案是使用计数排序的两趟扫描算法。
    首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
    你能想出一个仅使用常数空间的一趟扫描算法吗?

解题思路

  • 由于只能扫描一遍,将0都放在左边,2都放在右边。想到了用两个指针标记0,2的位置,然后通过交换的方法把所有0放在左边,2放在右边;
  • 扫描数组,用两个指针分别指向头尾,left左边为0,如果遍历遇到0,则与left指向位置都数交换;
  • 如果遍历遇到1,则i++ 继续遍历,如果遍历到2,则与right位置元素交换。

C++实现代码

class Solution {
public:
    void sortColors(vector& nums) {
        int len=nums.size();
        if(len<=1)return;
        int left=0,i=0,right=len-1;
        //遍历数组
        while(i<=right)
        {
            if(nums[i]==0)
            {
                swap(nums[i],nums[left]);
                left++;
                i++;
            }
            else if(nums[i]==2)
            {
                swap(nums[i],nums[right]);
                right--;
            } else
            {
                i++;
            }
        }
    }
};

你可能感兴趣的:(LeetCode刷题笔记)