一、题目描述

二、算法原理
由题目可知,我们可以把一个数组(无论是什么数组最终的情况)里面的情况分成:

故而,我们可以使用分治的思想来解决这道题:

可以把这个数组分成四个部分:
【0,left】:等于0
【left+1,i -1】:等于1
【i,right - 1】:未知数字(待扫描)
【right,nums.size() -1】:等于2
根据上面这四个部分可以制定处理方法:
当 nums[ i ] == 0 时,swap(nums[ i++ ] ,nums[ ++left ] );
当 nums[ i ] == 1 时,i++
当 nums[ i ] == 2 时,swap(nums[ i ],nums[ -- right] ),注意:这里的 i 是不能 ++ 的,因为当他们交换时,nums[ i ] 是一个未扫描的数字,所以我们要再扫描一次。
当然一开始 left = -1,i = 0,right = nums.size(),因为我们还没有开始处理数据。
三、代码实现
cpp
class Solution {
public:
void sortColors(vector<int>& nums) {
int i = 0;
int left = -1,right = nums.size();
while(i < right)
{
if(nums[i] == 0) swap(nums[i],nums[++left]);
else if(nums[i] == 2)
{
swap(nums[i],nums[--right]);
continue;//再次扫描未知数据
}
i++;
}
}
};
