C++刷题日记:Leetcode 75. 颜色分类
题目
Leetcode 75. 颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解析
无情STLAPI选手
直接sort(nums.begin(),nums.end());
AC
单指针
思想是很简单的,总共只有三种颜色代表0,1,2。
第一遍扫描把所有的零都通过swap方法,换到最前头,同时设定一个指针指向head,第二遍从head开始扫描,把1放前面,剩下的自然都是2了。
class Solution {
public:
void sortColors(vector<int>& nums) {
int l=nums.size();
int head=0;
for(int i=0;i<l;i++){
if(nums[i]==0){
swap(nums[i],nums[head]);
head++;
}
}
for(int i=head;i<l;i++){
if(nums[i]==1){
swap(nums[i],nums[head]);
head++;
}
}
}
};
时间复杂度:O(n),其中 n 是数组的长度。
空间复杂度:O(1)。
双指针
通过左右指针分别指向两头,在扫描指针i扫到0放前面,扫到2放末尾,如果末尾原来的数字是非1,也就是0或2,则需要i自减,并再次进行进行调整。这种双执针更加直观,容易理解
class Solution {
public:
void sortColors(vector<int>& nums) {
int l=nums.size();
int p = 0, q = l-1 ;//p->left q->right
for(int i=0 ; i<= q; ++i ){
if(nums[i] == 0){
nums[i] = nums[p];
nums[p] = 0 ;
++p;
}
if(nums[i]==2){
nums[i]=nums[q];
nums[q]=2;
--q;
if(nums[i]!=1){
--i;
}
}
}
}
};