LeetCode 75. Sort Colors
Solution1:
参考自:《leetcode-cpp 答案》
由于0,1,2非常紧凑,首先想到计数排序(counting sort),但需要扫描两遍,不符合题意
【注意】能用原始数组就用原始数组,真的是比模板快好多
class Solution {
public:
void sortColors(vector<int>& nums) {
int count[3] = {0};
for (auto i: nums)
count[i]++;
int index = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < count[i]; j++)
nums[index++] = i;
}
return;
}
};
Solution2:
参考自:https://www.cnblogs.com/ganganloveu/p/3703746.html
设置两个index,left记录第一个1的位置,left左边为0,right记录第一个非2的位置,right右边为2.
然后使用i从头到尾扫一遍,直到与right相遇。
i遇到0就换到左边去,遇到2就换到右边去,遇到1就跳过。
需要注意的是:由于left记录第一个1的位置,因此A[left]与A[i]交换后,A[left]为0,A[i]为1,因此i++;
而right记录第一个非2的位置,可能为0或1,因此A[right]与A[i]交换后,A[right]为2,A[i]为0或1,i不能前进,要后续判断。
由此该数组分为4段:[0,left)–>0; [left,i)–>1; [i,right]–>乱序; (right,n-1]–>2
class Solution {
public:
void sortColors(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
for (int i = 0; i <= right;) { //attention!!!
if (nums[i] == 0) {
swap(nums[i++], nums[left++]);
} else if (nums[i] == 2) {
swap(nums[i], nums[right--]);
} else
i++;
}
return;
}
};