版权声明:由于一些问题,理论类博客放到了blogger上,希望各位看官莅临指教https://efanbh.blogspot.com/;本文为博主原创文章,转载请注明本文来源 https://blog.csdn.net/wyf826459/article/details/82885698
题目描述:
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?
算法实现:
问题的关键在于一次扫描数组来实现排序,把思路讲清就会比较简单,就是一次扫描,遇到的0交换到左侧头部,遇到的2交换到右侧尾部,程序:
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size();
int i = 0, j = n - 1;
for(int k = 0; k < n; k ++){
while(k >= i && k <= j && nums[k] != 1){
if(nums[k] == 0)swap(nums[k],nums[i ++]);
else swap(nums[k],nums[j --]);
}
}
}
};