[算法系列之十一]荷兰国旗问题

荷兰国旗问题和快速排序 荷兰国旗问题有两种情况: 1)给定一个数x,<= x的整体放在左边,>x的整体放在右边 2)给定一个数x,< x的整体放在左边,= x的整体放在中间,> x的整体放在右边 规定不需要辅助数组,时间复杂度O(N)完成上面的调整 现在先来看第一个情况: 如图所示,我们先划分一个<=区域在左侧,第一个元素的下标位置是i,给定的数为x。现在我们需要对这个数组进行划分 1.当i在3这个位置的时候,i位置和&l. 阅读详情

【问题】

现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。

【分析】

这个问题我们可以将这个问题视为一个数组排序问题。红白蓝分别对应数字0、1、2。红、白、蓝三色小球数量并不一定相同。

【思路一】

First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.

(1)遍历数组,统计红白蓝三色球(0,1,2)的个数

(2)根据红白蓝三色球(0,1,2)的个数重排数组

时间复杂度:O(n)

【代码一】

    /**------------------------------------
    *   日期:2015-02-02
    *   作者:SJF0115
    *   题目: 75.Sort Colors
    *   网址:https://oj.leetcode.com/problems/sort-colors/
    *   结果:AC
    *   来源:LeetCode
    *   博客:
    ---------------------------------------**/
   class Solution {
    public:
        void sortColors(int A[], int n) {
            if(n <= 1){
                return;
            }//if
            // 统计个数
            int red = 0,white = 0,blue = 0;
            for(int i = 0;i < n;++i){
                if(A[i] == 0){
                    ++red;
                }//if
                else if(A[i] == 1){
                    ++white;
                }//else
                else{
                    ++blue;
                }//else
            }//for
            // 重新布局
            for(int i = 0;i < n;++i){
                if(red > 0){
                    A[i] = 0;
                    --red;
                }//if
                else if(white > 0){
                    A[i] = 1;
                    --white;
                }//else
                else{
                    A[i] = 2;
                }
            }//for
        }
    };

【思路二】

我们可以把数组分成三部分,前部(全部是0),中部(全部是1)和后部(全部是2)三个部分,每一个元素(红白蓝分别对应0、1、2)必属于其中之一。

将前部和后部各排在数组的前边和后边,中部自然就排好了。

设置两个指针begin指向前部的末尾的下一个元素(刚开始默认前部无0,所以指向第一个位置),end指向后部开头的前一个位置(刚开始默认后部无2,所以指向最后一个位置),然后设置一个遍历指针current,从头开始进行遍历。

(1)若遍历到的位置为1,则说明它一定属于中部,根据总思路,中部的我们都不动,然后current向前移动一个位置。

(2)若遍历到的位置为0,则说明它一定属于前部,于是就和begin位置进行交换,然后current向前移动一个位置,begin也向前移动一个位置(表示前边的已经都排好了)。

(3)若遍历到的位置为2,则说明它一定属于后部,于是就和end位置进行交换,由于交换完毕后current指向的可能是属于前部的,若此时current前进则会导致该位置不能被交换到前部,所以此时current不前进。而同1),end向前移动一个位置。
 

 【代码二】

    /**------------------------------------
    *   日期:2015-02-04
    *   作者:SJF0115
    *   题目: Sort Colors
    *   网址:https://oj.leetcode.com/problems/sort-colors/
    *   博客:
    ---------------------------------------**/
   class Solution {
    public:
        void sortColors(int A[], int n) {
            int begin = 0,end = n-1,cur = 0;
            while(cur <= end){
                if(A[cur] == 0){
                    swap(A[begin],A[cur]);
                    // 指向排序0末尾的下一个位置
                    ++begin;
                    // 向前遍历
                    ++cur;
                }//if
                else if(A[cur] == 1){
                    ++cur;
                }//else
                else{
                    swap(A[end],A[cur]);
                    // 指向排序2开头的前一个位置
                    --end;
                }//else
            }//for
        }
    };

 

【思路三】

用三个变量记录red,white,blue的下标位置。起始下标都为-1

如果A[i] == 0 ,插入red对white blue有影响,blue先整体向后移动一位,white再整体向后移动一位,如果不移动,前面插入的数据就会覆盖已有的。

如果A[i] == 1,插入white对blue有影响,blue整体向后移动一位。

A[i] == 2,直接插入blue
 

【代码三】

    /**------------------------------------
    *   日期:2015-02-03
    *   作者:SJF0115
    *   题目: 75.Sort Colors
    *   网址:https://oj.leetcode.com/problems/sort-colors/
    *   结果:AC
    *   来源:LeetCode
    *   博客:
    ---------------------------------------**/
    class Solution {
    public:
        void sortColors(int A[], int n) {
            if(n <= 1){
                return;
            }//if
            int red = -1,white = -1,blue = -1;
            for(int i = 0;i < n;++i){
                // 插入red对white blue有影响
                if(A[i] == 0){
                    // blue整体向后移动一位
                    A[++blue] = 2;
                    // white整体向后移动一位
                    A[++white] = 1;
                    // 插入red
                    A[++red] = 0;
                }//if
                // 插入white blue受到影响
                else if(A[i] == 1){
                    // blue整体向后移动一位
                    A[++blue] = 2;
                    // 插入white
                    A[++white] = 1;
                }//else
                // 插入blue对其他没有影响
                else{
                    // 插入blue
                    A[++blue] = 2;
                }//else
            }//for
        }
    };

 

本文原文地址:https://blog.youkuaiyun.com/SunnyYoona/article/details/43488481

Java实现荷兰国旗问题 问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球、白球、蓝球。这个问题之所以叫荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后正好组成荷兰国旗。 2 解决方案 为了方便编码与讨论,用数字0表示红球,数字1表示白球,数字2表示蓝球,所以最后生成的排列为0,1,2。 解决该问题,只需先设定三个用于指定元素的下标指针(PS:在Ja... 阅读详情

相关推荐

荷兰国旗问题(颜色排序问题)

题目描述 Sort Colors Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will u...

走走停停的专栏 2296

算法64-荷兰国旗问题

算法

weixin_41479678的博客 790

从“跳变”到“连续”:深入理解霍尔传感器插值与PLL角度估算的优劣与选择

本文深入解析霍尔传感器角度估算技术,对比线性插值法和锁相环(PLL)跟踪法的优劣,为电机控制领域的工程师提供实用指南。通过STM32F407和CubeMX的实例,详细探讨两种方法的实现细节、性能对比及优化策略,帮助在不同应用场景下做出最优选择。

weixin_30855761的博客 557

算法系列--荷兰国旗问题

转载 :https://yq.aliyun.com/articles/3604【问题】现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。【分析】这个问题我们可以将这个问题视为一个数组排序问题。红白蓝分别对应数字0、1、2。红、白、蓝三色小球数量并不一

大圣编了个程 966

ali140滑块

ali 140滑块采用补环境的方式进行逆向,需要的文件主要为这两个,其中collina.js是最主要的环境校验和参数加密的逻辑,这两个文件放本地进行补环境。然后挂上代理,先保证能够正常运行代码,补了些许后能够正常运行了,我们打印最主要的加密函数看看:n值就是得到:挂上代理看看鼠标事件,不管加密逻辑,关心入参即可:收集一些鼠标事件传进记录的函数。其余就是处理一些环境值,一些resetSA的逻辑就行。截图记录:

bboysteed的博客 1677

STM32G4实战:用CubeMX+Keil五分钟搞定FreeRTOS多任务LED控制(避坑指南)

本文详细介绍了如何在STM32G4系列芯片上使用CubeMX和Keil快速配置FreeRTOS实现多任务LED控制,包括环境准备、时钟配置、任务创建及常见问题解决方案。重点解决了时钟源冲突等高频问题,并提供了优化建议和进阶应用示例,帮助开发者高效完成嵌入式开发任务。

joy55的博客 222

荷兰国旗问题以及快速排序

  戳蓝字关注我们哦!!! 大家好,我是周一。最近几篇算法,我们都是聊的归并排序,归并排序也说的差不多了,今天讲讲快速排序。 荷兰国旗问题  1、啥是荷兰国旗问题荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示:假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但不仅仅只有这一种情况:需求是:把这些条纹按照颜色排好,红色的在上半部分,白色的在中间部分,蓝色的在下半部分,我们把这类问题称作荷兰国旗问题。

Java和算法学习的博客 6837

vue接入海康4G版摄像头通过萤石云平台推送视频流教程

vue-video-player接入海康视频,videojs-contrib-hls,vue播放视频

renkai721的专栏 7278

算法:快速排序与荷兰国旗问题

文章目录荷兰国旗算法描述荷兰国旗代码展示快排算法描述快排代码展示 在聊快速排序之前,我们先解释一下荷兰国旗,即把一个数组分成三个部分,我们一般选最后一个元素作为基准值,即大于这个数的全部在左边,小于这个数的全部在右边,等于的在中间。 举个例子:arr{1,5,3,7,4,2,3,4},选取4做基准值,把他排成{1,3,2,3,4,4,7,5}大于小于区域的数顺序不要求。 荷兰国旗算法描述 首先第一步设less指针为-1,more指针为length-1。你可以想象成less是一个小于区域的右边界而more是大

m0_47268721的博客 1121

QT实现MQTT服务端(附完整源码)

QT实现MQTT服务端(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1253

6、深入解析Microsoft 365核心服务对比与迁移策略

本文深入解析了Microsoft 365的核心服务,包括身份和设备管理、现代设备配置体验、Exchange和SharePoint的迁移策略以及Microsoft Teams的协作功能。同时探讨了迁移过程中需要考虑的安全控制措施,为组织规划和实施云迁移项目提供了全面的指导和建议。

k8s6orchestrator的博客 107

荷兰国旗问题(分三块)

——堆排序扩展问题 已知一个几乎有序的数组,几乎有序是指,如果把数组排好序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 分析: 假设k的值等于7,那么我们申请一个可以容纳8个数的小根堆。将数组下标从0到7的数字放入小根堆中。接着从这个小根堆中弹出一个数,那么这么数就是该数组最小的数,然后再向着个堆中添加一个数,再弹出……这样可...

菜鸟变大鸟的博客 1万+

手把手教你学simulink(31.31)--双向DCDC电源场景示例:设计并实现一个基于变频控制的双向降压变换

设计并实现一个基于 Simulink 的双向降压变换器,能够在充电模式(从高压侧向低压侧传输能量)和放电模式(从低压侧向高压侧传输能量)之间切换,确保输出电压稳定,并根据负载变化自动调整工作模式。

MHD0815的博客 343

C语言实例——荷兰国旗问题

C语言实例——荷兰国旗问题 问题描述: 要求重新排列一个由字符R,W,B(R代表红色,W代表白色,B代表蓝色)构成的数组,使得所有的R都排在最前面,W排在其后,B排在最后。 解决思路: 问题实质为对一个字符数组重新排序 ...

qq_30083557的博客 3661

请尽可能地详细说明一个VLA项目的立项训练到落地的全流程

一个机器人VLA项目的全流程是一个复杂的系统工程,它深度融合了机器人学 (Robotics)计算机视觉 (CV)和自然语言处理 (NLP)。其核心挑战在于高质量数据的获取和从仿真到现实的有效迁移。与纯粹的软件AI项目相比,它增加了硬件、物理交互和安全性的维度,但其最终能让AI走出虚拟世界、在物理世界中产生实际价值,这也是其巨大的魅力所在。

具身机器人和通用AI 303

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

算法:荷兰国旗问题

荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示: 假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但是绝非只有这一种情况: 需求是:把这些条纹按照颜色排好,红色的在上半部分,白色的在中间部分,蓝色的在下半部分,我们把这类问题称作荷兰国旗问题。 我们把荷兰国旗问题用数组的形式表达一下是这样的: 给定一个整数数组,给定一个值K,这个值在原数组中...

OceanStar的博客 3724

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

荷兰国旗问题

 上方的图片便是一个荷兰国旗,从图中我们可以很清楚的看出它的特点,它有三个区域组成,即红,白,蓝。好,现在我们的问题出来了。现在我们面前有一张桌子,桌子上整齐的摆放着红色,白色,蓝色三种线条,但他们的顺序是凌乱的。我们的要求是:用一个算法把这些线条挑出来重新摆放顺序,最后的结果就像上图的荷兰国旗,红色在上,白色在中间,蓝色在最下面。 好了,我们该如何实现上面的问题呢?其实拿到这

随缘的专栏 8750

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

算法之路_9、荷兰国旗问题

一、荷兰国旗问题(数组分割问题的扩展)  给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放在数组的中间,大于num的数放在数组的 右边。 要求额外空间复杂度O(1),时间复杂度O(N) 二、解释 通过具体问题可以看出,这是上一篇博文数组分割问题的扩展,上一篇是将小于等于的放在数组左边,大于放在数组右边,两份切。本篇荷兰国旗问题是小于数放左边,等于放中...

郭岚的博客 1万+

快排-荷兰国旗

在使用partition-exchange排序算法时,如快速排序算法,我们会遇到一些问题,比如重复元素太多,降低了效率,在每次递归中,左边部分是空的(没有元素比关键元素小),而右边部分只能一个一个递减移动。结果导致耗费了二次方时间来排序相等元素。这时我们可以多分一个区,即,小于区,等于区,大于区。(传统快排为小于区和大于区)   下面我们通过一个经典例题来练习这种思想。 荷兰国旗问题 ”荷...

少说,多做。 5155

快速排序之荷兰国旗问题

描述         荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红、白、蓝。现有若干由红、白、蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起。本问题要求将所有红色的条块放最左边、所有白色的条块放中间、所有蓝色的条块放最右边。 3种颜色(0,1,2)在一个数组里,每次只可交换一次,扫描一边后,三种颜色自然分开,应为颜色为:红,白,蓝,(荷兰国旗的颜色)所也叫荷兰...

赵智任的博客 4413
上一篇: [算法系列之十]大数据量处理利器:布隆过滤器
下一篇: [算法系列之十二]字符串匹配之蛮力匹配
Roger_CoderLife
博客等级 码龄9年 211粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值