【剑斩OFFER】算法的暴力美学——颜色分类

一、题目描述

二、算法原理

由题目可知,我们可以把一个数组(无论是什么数组最终的情况)里面的情况分成:

故而,我们可以使用分治的思想来解决这道题:

可以把这个数组分成四个部分:

【0,left】:等于0

【left+1,i -1】:等于1

【i,right - 1】:未知数字(待扫描)

【right,nums.size() -1】:等于2

根据上面这四个部分可以制定处理方法:

当 nums[ i ] == 0 时,swap(nums[ i++ ] ,nums[ ++left ] );

当 nums[ i ] == 1 时,i++

当 nums[ i ] == 2 时,swap(nums[ i ],nums[ -- right] ),注意:这里的 i 是不能 ++ 的,因为当他们交换时,nums[ i ] 是一个未扫描的数字,所以我们要再扫描一次。

当然一开始 left = -1,i = 0,right = nums.size(),因为我们还没有开始处理数据。

三、代码实现

cpp 复制代码
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int i = 0;
        int left = -1,right = nums.size();
        while(i < right)
        {
            if(nums[i] == 0) swap(nums[i],nums[++left]);
            else if(nums[i] == 2)
            {
                swap(nums[i],nums[--right]);
                continue;//再次扫描未知数据
            }
            i++;
        }
    }
};
相关推荐
炸膛坦客12 分钟前
单片机/C/C++八股:(十九)栈和堆的区别?
c语言·开发语言·c++
2401_831824961 小时前
代码性能剖析工具
开发语言·c++·算法
是wzoi的一名用户啊~1 小时前
【C++小游戏】2048
开发语言·c++
Sunshine for you2 小时前
C++中的职责链模式实战
开发语言·c++·算法
qq_416018722 小时前
C++中的状态模式
开发语言·c++·算法
2401_884563242 小时前
模板代码生成工具
开发语言·c++·算法
2401_831920742 小时前
C++代码国际化支持
开发语言·c++·算法
m0_672703313 小时前
上机练习第51天
数据结构·c++·算法
ArturiaZ3 小时前
【day60】
算法·深度优先·图论
2401_851272993 小时前
自定义内存检测工具
开发语言·c++·算法