当前位置: 首页 > 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种)的快速原地排序,例如图像处理中的像素值排序、分类统计等。  

总结  

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

http://www.dtcms.com/a/32575.html

相关文章:

  • 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
  • 被裁20240927 --- WSL-Ubuntu20.04安装cuda、cuDNN、tensorRT
  • PHP post 数据丢失问题
  • .NET MVC实现电影票管理
  • 【NLP 31、预训练模型的发展过程】
  • 游戏引擎学习第118天
  • java开发——为什么要使用动态代理?
  • 0222-leetcode-1768.交替合并字符串、389找不同、
  • 异步联邦学习的动态隐私保护框架:重构边缘智能的数据安全边界
  • 采用sidecar模式,将127.0.0.1的请求打到目标机器
  • 网页制作06-html,css,javascript初认识のhtml如何建立超链接