当前位置: 首页 > news >正文

【算法系列】荷兰国旗问题:三指针法原地排序

一、题目(leetcode75 颜色分类 --三分数组)


二、思路

算法核心:三指针分治策略  
该问题被称为“荷兰国旗问题”(Dutch National Flag Problem),由计算机科学家Edsger Dijkstra提出。其核心思想是通过三个指针将数组划分为三个区域,逐步将元素归位。

指针定义与规则  
1. 指针分工  
left:标记`0`的右边界(初始指向头部)  
i:当前遍历位置(初始指向头部)  
right:标记`2`的左边界(初始指向尾部)  

2. 遍历规则


三、代码

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int left=-1,right=nums.size(),i=0;
        while(i<right)
        {
            if(nums[i]==0)
                swap(nums[++left],nums[i++]);
            else if(nums[i]==1)
                ++i;
            else
                swap(nums[i],nums[--right]);
        }
    }
};

复杂度与适用场景  

时间复杂度:O(n),线性遍历。  
空间复杂度:O(1),仅使用常数指针。  
适用场景:元素种类有限(如3种)的快速原地排序,例如图像处理中的像素值排序、分类统计等。  

总结  

三指针法通过巧妙的分区策略,将荷兰国旗问题的时间复杂度优化到极致。该算法不仅是一道经典面试题,更体现了分治思想在实际工程中的应用价值。掌握这一方法,可轻松应对类似的多分类排序问题。

相关文章:

  • comfy 面部修复(ComfyUI-Impact-Pack)
  • mybatis 细节(${ ..}和#{..},resultType 和 resultMap的区别,别名的使用,Mapper 代理模式)
  • vue-treeselect显示unknown的问题及解决
  • React 高阶组件的优缺点
  • CMake入门
  • HDFS Java 客户端 API
  • QML MouseArea 鼠标事件详解
  • SQLMesh 系列教程8- 详解 seed 模型
  • 每日一题——验证IP地址
  • Docker教程(喂饭级!)
  • 数字化电子(不动产经营租赁服务)发票版式文件说明
  • 孜然单授权系统V2.0PHP授权系统
  • List 接口中的 sort 和 forEach 方法
  • Linux-GlusterFS进阶分布式卷
  • python 虚拟机的使用方式
  • 实验-安装Proteus
  • 大模型监督微调(SFT)技术解析
  • Open-WebUI前后端分离部署并基于DeepSeek实现智能问答
  • 虚拟机从零实现机器人控制
  • 安全面试2
  • 秦洪看盘|交易型资金收缩,释放短线压力
  • 比尔·盖茨:未来20年通过盖茨基金会捐出几乎全部财富,2045年底基金会停止运营
  • 招行:拟出资150亿元全资发起设立金融资产投资公司
  • 毗邻三市人均GDP全部超过20万元,苏锡常是怎样做到的?
  • 城管给商户培训英语、政银企合作纾困,上海街镇这样优化营商环境
  • 鸿蒙电脑正式亮相,五年布局积累超2700项核心专利