荷兰旗问题、三分法、Three-Way-Partition 详解

Three-Way-Partition

荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示:

img

假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但是绝非只有这一种情况:

img

需求是:把这些条纹按照颜色排好,红色的在上半部分,白色的在中间部分,蓝色的在下半部分,我们把这类问题称作荷兰国旗问题。

我们把荷兰国旗问题用数组的形式表达一下是这样的:

给定一个整数数组,给定一个值 Key,这个值在原数组中一定存在,要求把数组中小于 Key 的元素放到数组的左边,大于 Key 的元素放到数组的右边,等于 Key 的元素放到数组的中间,最终返回一个整数数组,其中只有两个值,分别是等于 Key 的数组部分的左右两个下标值。

思考

对于如下数组,我们如何在 O ( n ) O(n) O(n) 的时间完成三分法?

截屏2021-04-14 19.25.50

假设对于数组 a a a

红色区域: a [ 0 ] , a [ 1 ] , . . , a [ l e s s ] a[0],a[1],..,a[less] a[0],a[1],..,a[less] 为小于 k e y key key 的部分

白色区域: a [ l e s s + 1 ] , a [ l e s s + 2 ] , . . , a

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值