原题
LeetCode 75. 颜色分类
思路
- 用三指针排序
- 指针i指向0的末尾,j指向2的前端,t指向1的末尾,k是当前遍历的数。[k,j]是还未处理的区间,[0, k)是已经处理好的0, 1排序好的区间,(j, n-1]是只有2的区间。
- 如果当前遍历的数等于0,把第k个数和第i个数交换,为什么此时i和t都能往后移呢,如果k前都是0,那么i和t肯定都往后移,但如果k前是0,0,1,1这种配置,那么肯定是1被转移到了k目前的位置,所以1的末尾位置t也要往后移一个。
- 如果当前遍历的数等于2,那就将第k个数和第j个数交换,此时k不往后移,因为还得判断换过来的k是0还是1
- 如果当前遍历的数是1,那么t++,k++就好
代码
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size();
int i = 0, j = n - 1, t = 0;
int k = 0;
while (k <= j) {
if (nums[k] == 0) {
swap(nums[k], nums[i]);
i++;
t++;
k++;
}
else if (nums[k] == 2) {
swap(nums[k], nums[j]);
j--;
}
else {
t++;
k++;
}
}
return;
}
};
官方题解方法: 其实感觉大致思想是一致的,不过确实写得简单明了多了
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size();
int p0 = 0, p1 = 0;
for (int i = 0; i < n; ++i) {
if (nums[i] == 1) {
swap(nums[i], nums[p1]);
++p1;
} else if (nums[i] == 0) {
swap(nums[i], nums[p0]);
if (p0 < p1) {
swap(nums[i], nums[p1]);
}
++p0;
++p1;
}
}
}
};