【剑斩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++;
        }
    }
};
相关推荐
码匠许师傅1 天前
【C++ 面试真题】聊聊 C++ 的序列容器
java·c++·面试
ValhallaCoder1 天前
Leetcode-hot100(2026.08.17)
python·算法·leetcode
C++ 老炮儿的技术栈1 天前
Qt5.9.1 Windows 完整开发环境搭建流程
开发语言·c++·windows·qt·编辑器·代码化
泡沫冰@1 天前
GO 语言基础
开发语言·算法·golang
键盘会跳舞1 天前
C++:std::tuple 源码级深度拆解——变参模板、SFINAE与模板元编程核心技巧
开发语言·c++·sfinae·变参模板
bkspiderx1 天前
从零开始:VS Code搭建C/C++开发环境全指南(Windows/macOS/Linux)
c语言·c++·windows·vs code·c/c++开发环境
东华万里1 天前
第40篇C++核心基础与工程实践:从底层逻辑到避坑指南
开发语言·c++·面试·大学生专区
luj_17681 天前
元设计的诱惑与现实
c语言·开发语言·c++·经验分享·算法
小星星闪亮登场1 天前
ST表--倍增思想
开发语言·数据结构·c++·算法·思维
东华万里1 天前
第40篇 C++核心基础与工程实践:从底层逻辑到避坑指南
开发语言·c++·大学生专区