【剑斩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++;
        }
    }
};
相关推荐
ShineWinsu5 小时前
对于C++:类和对象的解析—下(第二部分)
c++·面试·笔试·对象··工作·stati
2013092416275 小时前
1968年 Hart, Nilsson, Raphael 《最小成本路径启发式确定的形式基础》A* 算法深度研究报告
人工智能·算法
如何原谅奋力过但无声5 小时前
【力扣-Python-滑动窗口经典题】567.字符串的排列 | 424.替换后的最长重复字符 | 76.最小覆盖子串
算法·leetcode
BHXDML6 小时前
第七章:类与对象(c++)
开发语言·c++
玄冥剑尊6 小时前
贪心算法进阶
算法·贪心算法
玄冥剑尊6 小时前
贪心算法深化 I
算法·贪心算法
52Hz1186 小时前
力扣73.矩阵置零、54.螺旋矩阵、48.旋转图像
python·算法·leetcode·矩阵
BHXDML7 小时前
第一章:线性回归& 逻辑回归
算法·逻辑回归·线性回归
yyf198905257 小时前
C++ 跨平台开发的挑战与应对策略
c++
iAkuya7 小时前
(leetcode)力扣100 二叉搜索树种第K小的元素(中序遍历||记录子树的节点数)
算法·leetcode·职场和发展