给定一个包含红色、白色和蓝色、共 n
个元素的数组 nums
,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
示例 1:
输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2]
class Solution {
public void sortColors(int[] nums) {
int left = 0, right = nums.length - 1, i = 0;
while (i <= right) {
if (nums[i] == 2) {
// 交换nums[i]和nums[right],然后只减少right
int temp = nums[right];
nums[right] = nums[i];
nums[i] = temp;
right--;
} else if (nums[i] == 0) {
// 交换nums[i]和nums[left],然后增加left和i
int temp = nums[left];
nums[left] = nums[i];
nums[i] = temp;
left++;
i++;
} else {
// 如果是1,只移动i
i++;
}
}
}
}
这个问题可以通过一种称为“三指针”方法来高效解决。三指针方法涉及到三个指针:left
、right
和i(指向当前的元素)
,其中left
用于红色(0)的正确位置交换,right
用于蓝色(2)的正确位置交换,而curr
用于当前遍历的元素。这一题感觉就是指针的加减绕得好晕啊。。。菜就多练吧