题目
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
来源:力扣(LeetCode)
解法
本题是经典的「荷兰国旗问题」,由计算机科学家 Edsger W. Dijkstra 首先提出。
解法较多,本解法时间复杂度是O(N),空间复杂度为O(1)
定义两个指针:p0,p1
指针移动规则
规则1:
p0 <= p1;
规则2:
p0 < p1时,先交换p0和i,再交换p1和i
规则3:
p0 = p1时,p0移动,p1也要移动
规则4:
每次交换指针都要移动一次,不用立即移动,但必须在下次开始前移动。
规则5:
指针比较大小应在本次行动之前比较
void swap(int *nums, int i, int j)
{
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
void sortColors(int* nums, int numsSize){
//用两个指针,一个查看2,一个查看0,
//找到0,1和左右换位置
//不能对我以扫描过的区域再进行改动
int p0 = 0;
int p1 = 0;
for(int i = 0; i < numsSize; i++)
{
printf("p0:%d p1:%d\n",p0,p1);
if(nums[i] == 0)
{
swap(nums, i, p0);
//规则5
if(p0 < p1)
{
swap(nums, i, p1);
p1++;
}
//规则4:
p0++;
//规则3
if(p1 <= p0)
p1++;
}
else if(nums[i] == 1)
{
swap(nums, i, p1);
p1++;
}
}
}
作者:he-si-yuan-w
链接:https://leetcode-cn.com/problems/sort-colors/solution/shuang-zhi-zhen-ti-qu-shu-zu-zhong-de-li-nb28/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。