75. 颜色分类
给定一个包含红色、白色和蓝色、共 n
个元素的数组 nums
,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
class Solution {
public:void sortColors(vector<int>& nums) {int red =0,white = 0,blue = 0;for(int i=0;i<nums.size();i++){if(nums[i]==0)red++;else if(nums[i]==1)white++;else blue++;}for(int i=0;i<nums.size();i++){if(i<red)nums[i]=0;else if(i<white+red) nums[i]=1;else nums[i]=2;}}
};
其实排个序就行,我这是按提示写的,时间复杂度较排序更低
如果面试,最好是用三指针法,只需一次遍历
class Solution {
public:void sortColors(vector<int>& nums) {int low = 0, mid = 0, high = nums.size() - 1;while (mid <= high) {if (nums[mid] == 0) {swap(nums[low], nums[mid]);low++;mid++;} else if (nums[mid] == 1) {mid++;} else { // nums[mid] == 2swap(nums[mid], nums[high]);high--;}}}
};
逻辑就是用指针标记0,1,2所在位置,然后遍历时交换即可