给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————
使用三个指针,指针L初始化为索引地址0,指针R初始化为索引地址
n
u
m
s
.
s
i
z
e
(
)
nums.size()
nums.size(),指针cur用于遍历数组。
- 当指针cur指向的值为0时,则将当前值和指针L指向的数值进行交换。并将指针L和指针cur的索引地址加1;
- 当指针cur指向的值为2时,则将当前值和指针R指向的数值进行交换。并将指针R的索引地址减1;
- 当指针cur指向的值为1时,则将cur的索引地址加1;
在上面的规律中,当指针指向的值为0时,指针L和指针cur的索引地址都加1;当指针cur指向的值为2时,仅仅是将指针R的索引地址减1而不对cur的索引值进行修改。
这是因为在cur左边的数组值都是遍历过的,必定不会出现值为2的情况,所以可以直接跳过。
综上,其C++代码如下,其时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
class Solution {
public:
void sortColors(vector<int>& nums) {
int l = 0;
int r = nums.size()-1;
// int cur = 0;
for(int cur=0;cur<=r;)
{
if(nums[cur]==0)
{
nums[cur] = nums[l];
nums[l] = 0;
cur++;
l++;
}
else if(nums[cur]==2)
{
nums[cur] = nums[r];
nums[r] = 2;
r--;
}
else
cur++;
}
}
};