【排序】【数组】LeetCode 75. 颜色分类
题目链接
思路
题目要求按0、1、2的顺序排序,因为数量有限,所以通过两次遍历,分别将0和1交换到合适的位置,这样两次遍历之后,剩下的2就都在尾部了。
circle
代表这一次要对哪个数字进行重置位置,所以它的取值就限定在0、1,因为当我们确定好0和1位置之后,2的位置也就确定好了。
p
表示当前数字应该放置的位置,因为要从前往后排0、1、2,所以初值为 p=0
。
在第二层循环中,我们将与 circle
相等的元素放在 p
的位置,如果符合条件,便将 nums[i]
与 nums[p]
的值进行交换。交换完成后 p++
,指向下一个要放置的位置。
代码
class Solution {
public void sortColors(int[] nums) {
int p = 0;
for (int circle = 0; circle < 2; ++circle) {
for (int i = p; i < nums.length; i++) {
// circle == 0 or 1
// when circle == 0, we should move 0 to nums' head
// when circle == 1, we should move 1 to nums' middle
if (circle == nums[i]) {
int temp = nums[i];
nums[i] = nums[p];
nums[p] = temp;
++p;
}
}
}
}
}