https://leetcode.com/problems/sort-colors/
简化题意就是,有一个arr,里面只有0,1,2三个数字,将这个arr排序
-方法1: 遍历两次数组,第一遍求出0个个数,1的个数和2的个数,然后第二遍把这些数字都填进数组
如果题目要求只能遍历一次数组呢?
- 方法二,只遍历一次数组
三个标志位,left表明所有为1的最左边的下表。right表明2的最左边的下标-1
curr表示当前遍历到的位置
public void sortColors(int[] nums) {
int left = 0;
int right = nums.length - 1;
int curr = 0;
while (curr <= right) {
if (nums[curr] == 0) {
swap(nums, curr, left);
//left为1的最左边,所以在1的右边发现0,则交换,并且把left和curr都加1
//特殊情况left没找到1的时候,left和curr一定都是0,因为当curr为1时,curr++了,而left没有加
left++;
curr++;
continue;
}
if (nums[curr] == 1) {
curr++;
continue;
}
if (nums[curr] == 2) {
//right为2的最左边,所以在2的左边发现2,交换
//此时不知道交换过去的原nums[right]是多少,所以curr不变,继续下一个循环,而只把right--
swap(nums, curr, right);
right--;
}
}
}
public void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}









网友评论