【每日算法】LeetCode 75 —— 颜色分类(一百六十七)

题目内容

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

要求:以不使用代码库中的排序函数且想出一个仅使用常数空间的一趟扫描算法求解。

示例

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [0]
输出:[0]

示例 4:

输入:nums = [1]
输出:[1]

提示

1、n == nums.length
2、1 <= n <= 300
3、nums[i] 为 0、1 或 2

题解

本题考查指针算法。具体思路如下:

1、维护三个指针,i、j、k

2、令0到j-1的位置上满足全部都是0,j到i-1的位置上全部都是1,k+1到n-1的位置上全部都是2

3、每次i指针向后移动,会出现以下3种情况:

(1)当i的指向为0时,swap(nums[i],nums[j]),j++,i++

(2)当i的指向为2时,swap(nums[i],nums[k]),k—

(3)当i的指向为1时,i++

具体请看代码。

代码

class Solution {
public:
void sortColors(vector<int>& nums) {
//三指针算法,i、j从0开始,k从末尾开始。
for(int i = 0, j = 0, k = nums.size() - 1; i <= k;){
if(nums[i] == 0) swap(nums[i++],nums[j++]);
else if(nums[i] == 2) swap(nums[i],nums[k--]);
else i++;
}

}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/06/10/【每日算法】LeetCode-75-——-颜色分类(一百六十七)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号