c语言荷兰国旗问题算法,[算法题] 荷兰国旗问题

1. 问题描述

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

033988bfa1af2f3d1e71f91799aa7927.png

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

8c5bd58603b2c71732d6a4f7e4493ab5.png

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

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

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

例如,给定数组:[2, 3, 1, 9, 7, 6, 1, 4, 5],给定一个值4,那么经过处理原数组可能得一种情况是:[2, 3, 1, 1, 4, 9, 7, 6, 5],需要注意的是,小于4的部分不需要有序,大于4的部分也不需要有序,返回等于4部分的左右两个下标,即[4, 4]

2. 处理过程图示

我们以上面举的例子来看看处理过程的图示:

4886905

image.png

less 用于记录小于 4 的区域的右下标,初始为-1,代表不存在

more 用于记录大于 4 区域的左下标,初始为9,代表不存在

L 用于正在遍历的元素的下标,初始值为0

从 arr[L] 即 arr[0] 开始遍历数组

如果 arr[L] > 4, 交换 arr[++ less] 和 arr[L++] 的值

如果 arr[L] < 4, 交换 arr[--more] 和 arr[L] 的值

如果 arr[L] = 4, 不交换,L++,直接遍历下一个值

当 L >= more,退出循环。

4886905

3. Java代码实现

本文同步分享在 博客“CoderJed”(JianShu)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值