LeetCode解题 75:Sort Colors
Problem 75: Sort Colors [Medium]
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note: You are not suppose to use the library’s sort function for this problem.
Example:
Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]
Follow up:
- A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0’s, 1’s, and 2’s, then overwrite array with total number of 0’s, then 1’s and followed by 2’s. - Could you come up with a one-pass algorithm using only constant space?
来源:LeetCode
解题思路
两次遍历很简单,只需要额外的两个变量red,white来记录红色和白色的个数。
题目中要求一次遍历且只需要参数空间,只需要在遍历数组时,使用双指针从头和尾分别记录红色的坐标边界和蓝色的坐标边界,如果遍历遇到0就和红色边界nums[red]
交换,遇到2就与蓝色边界nums[blue]
交换,遇1不做操作。
具体过程:
- 使用red和blue分别记录两个坐标边界。初始化为0和N-1。
- 当
n
u
m
s
[
i
]
=
=
0
nums[i] == 0
nums[i]==0时,将
nums[i]
与nums[red]
交换, r e d + + red++ red++。 - 当
n
u
m
s
[
i
]
=
=
2
nums[i] == 2
nums[i]==2时,将
nums[i]
与nums[blue]
交换, b l u e − − blue-- blue−−。 - 注意1:遍历遇到2时,因为与
nums[i]
交换的nums[blue]
没有检查过,所以交换后i
需要减一,停留在原地重新检查一次。 - 注意2:当
i
超过blue
时,后面的都是2,不需要再检查,因此遍历范围为[0, blue]
(blue实时更新)而不是[0, N-1]
。
整个算法时间复杂度为O(n),空间复杂度为O(1)。
运行结果:
要点:双指针
Solution (Java)
class Solution {
public void sortColors(int[] nums) {
int N = nums.length;
int red = 0;
int blue = N-1;
int temp;
for(int i = 0; i <= blue; i++){
if(nums[i] == 0){
nums[i] = nums[red];
nums[red++] = 0;
}
else if(nums[i] == 2){
nums[i] = nums[blue];
nums[blue--] = 2;
i--;
}
}
}
}
修改过程
- 在遇到2时没有在原地重新检查一次,导致跳过了一些数字。