荷兰国旗问题

刚才在严蔚敏的数据结构习题上看到的这个题。看了几篇博客。貌似都没有结合数据结构的意思来解释。

让我有种冲动写篇文章。。就把这当作我的第一篇博文吧。

 

问题描述:

荷兰国旗问题 ,设有一个仅有红白蓝三种颜色的条块组成的条块序列。请编写一个时间复杂度为O(n)的算法,使得这些条块按红、白、蓝的顺序排好,即排成荷兰国旗的图案。

 

解析:

算法一:

首先复杂度为O(n)。这很容易让人想到扫一遍然后放入3个栈中。这样空间复杂度就为O(3*n)。

其实这种算法用到了基数排序的思想。先设置判断条件。把符合条件的放入相应栈中,然后按序取出。

虽然看上去算法不稳定。由于只有颜色这一种区分,所以取出的顺序可以随便取。

优点:

容易想到。实现不复杂,只用设置3个栈,并且标号就行了。

缺点:

空间浪费大。而实际上元素移动的次数为2n。比下面说到的方法要多。

 

 

算法二:

有了算法一,我们能不能缩小空间的使用呢?答案是可以。

因为简单一看。如果我们把栈设在原始的数组中的话。是不是就可以节约3n的空间了?

那么怎样把栈塞到原始数组中呢?其实只用多扫描一遍原始数组就可以了。记录下rflag wflag bflag的次数就可以了!

如此以来。3个flag变量就成了栈的top变量了!

然后开始扫描3个变量的位置,如果是对应相同,那么就自加。如果不是,就找当前位置的颜色放到对应的栈中。

比方说红色栈顶事蓝色。那么就和对应的bfla

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值