这个题的意思是,给一个包含0,1,2无序的数组,排序。
我的方法是,遍历两遍数组,记录0的个数,1的个数,2的个数,然后重写数组。其中定义一个idx,记录下现在写到哪一个了。
class Solution {
public:
void sortColors(vector<int>& nums) {
unordered_map<int, int> m;
int idx = 0;
for(int i = 0; i < nums.size(); ++i){
m[nums[i]]++;
}
for(int i = 0; i < 3; ++i){
for(int j = 0; j < m[i]; ++j){
nums[idx++] = i;
}
}
}
};
题目中还要让只遍历一次数组来求解,那么我需要用双指针来做,分别从原数组的首尾往中心移动。
- 定义red指针指向开头位置,blue指针指向末尾位置
- 从头开始遍历原数组,如果遇到0,则交换该值和red指针指向的值,并将red指针后移一位。若遇到2,则交换该值和blue指针指向的值,并将blue指针前移一位。若遇到1,则继续遍历。这样就把0都移到数组的左端,2都移到数组的右端了。
class Solution {
public:
void sortColors(int A[], int n) {int red = 0, blue = n - 1;
for (int i = 0; i <= blue; ++i) {
if (A[i] == 0) {
swap(A[i], A[red++]);
} else if (A[i] == 2) {
swap(A[i--], A[blue--]);
}
}
}
};