- int n = nums.length;:获取数组的长度。
- int p1=0, p2=n-1;:设置两个指针,p1指向数组的开始,用于交换0;p2指向数组的末尾,用于交换2。
- for(int i = 0; i < n; i++):遍历数组。
- while(i <= p2 && nums[i] == 2):当当前元素为2时,将其与p2位置的元素交换,p2减1。这是为了将所有的2都移动到数组的末尾。
- if(nums[i] == 0):如果当前元素为0,将其与p1位置的元素交换,p1加1。这是为了将所有的0都移动到数组的前面。
- 交换元素时使用了临时变量temp来帮助交换。
class Solution {
public void sortColors(int[] nums) {
// 排序 从小到大 然后相同的元素需要在一起
// 双指针交换
int n = nums.length;
int p1 = 0;
int p2 = n - 1;
for(int i = 0; i < n; i++){
// 当前元素为2的时候 与p2位置进行交换 将数字2移动到数组的末尾
// 交换后,i的位置上现在是原来p2位置上的元素。
// 此时,这个新到i位置的元素还没有被检查,因此不能简单地将i递增
while(i <= p2 && nums[i] == 2){
int temp = nums[i];
nums[i] = nums[p2];
nums[p2] = temp;
p2--;
}
// 当前元素为0 移动到数组前面
if(nums[i] == 0){
int temp = nums[i];
nums[i] = nums[p1];
nums[p1] = temp;
p1++;
}
}
}
}