16、颜色分类
题目
16.0、暴力
你可以直接用sort()函数排序,或者自己写一个冒泡排序或者其他什么的排序。
- 时间复杂度:O(n平方)或者是n log n
- 空间复杂度:O(1)
16.1、单指针遍历两次
第一遍遍历把所有的0都移动到开头(记得设置一个变量来记录最后一个0到哪个位置了)
第二遍遍历把所有的2都移动到结尾(记得设置一个变量来记录最前一个2到哪个位置了)
- 时间复杂度:O(n)
- 空间复杂度:O(1)
16.2、双指针遍历一次
对于上面的遍历两次,完全可以只遍历一次时实现0移到开头,2移到结尾
只不过需要注意2移到结尾时遍历指针不能+1,仍需要验证该数
void sortColors2(vector<int>& nums)
{
if (nums.empty())return; //为空直接返回
int leftIndex = 0, rightIndex = nums.size() - 1;
int moveIndex = 0;
while (moveIndex <= rightIndex)
{
int num;
if (nums[moveIndex] == 0)
{
swap(nums[leftIndex], nums[moveIndex]);
leftIndex++;
moveIndex++;
}
else if (nums[moveIndex] == 2)
{
swap(nums[rightIndex], nums[moveIndex]);
rightIndex--;
}
else
moveIndex++;
}
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)
16.3、双指针遍历一次(另一种)
就是把0移到开头(记录最后0的位置),把1移到0的后面(记录最后1的位置)
换汤不换药(~_~)
- 时间复杂度:O(n)
- 空间复杂度:O(1)