题目描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c917a06f40e4ca14ff2c50de16435a66.png)
题目分析
- 这道题给定得数组中只有
0 1 2
这三个数字,所以唯一要做的就是排序 - 最直接的方法就是直接双重遍历排序
- 可以使用多指针的方法,尽量一次遍历就完成排序
- 可以使用两个个指针,分别指向
0 1 2
三个数字的交界处 - 如果当前值是
0
就往头部放,如果是 2
就往尾部放,这样中间的值自然就是 1
了 - 再用这两个指针和当前遍历的值进行判断,直到数组所有元素全部遍历一遍为止
解法分析
- 使用 while 循环,直到当前遍历的指针与指向
1 和 2的交界处
的指针相遇,表示已经排序完成 - 如果当前值为
0
,就让当前值和指向0 和 1的交界处
的值交换,继续遍历下一个 - 如果当前值为
2
,就让当前值和指向1 和 2的交界处
的值交换,这里要注意,因为不能保证交换的值就是1,所以需要继续判断一次,也就是当前指针不前进
代码
class Solution {
public void sortColors(int[] nums) {
int zero = 0;
int two = nums.length-1;
int cur = 0;
int temp;
while(cur <= two){
if(nums[cur] == 0){
temp = nums[zero];
nums[zero++] = nums[cur];
nums[cur++] = temp;
} else if(nums[cur] == 2){
temp = nums[cur];
nums[cur] = nums[two];
nums[two--] = temp;
} else {
cur++;
}
}
}
}