1. 问题描述

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

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

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

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

给定一个整数数组,给定一个值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. 处理过程图示

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

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,退出循环。

3. Java代码实现

public static int[] partition(int[] arr, int L, int R, int p) {

int less = L - 1;

int more = R + 1;

while(L < more) {

if(arr[L] < p) {

swap(arr, ++less, L++);

} else if (arr[L] > p) {

swap(arr, --more, L);

} else {

L++;

}

}

return new int[] { less + 1, more - 1 };

}

public static void swap(int[] arr, int i, int j) {

int temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

python单链表实现荷兰国旗问题_[算法题] 荷兰国旗问题相关推荐

  1. python 单链表节点怎么快速定义_线性表链式存储结构之单链表

    线性表的链式存储结构的特点就是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以在内存中未被占用的任意位置.比起顺序存储结构每个元素只需要存储一个位置就可以了.现在链式存储结构中,除了要存储数 ...

  2. python单链表排序_单链表排序之选择排序

    单链表排序是单链表的常见编程任务之一,也是面试中经常出现的题目.单链表排序的关键是交换算法,需要额外考虑.选择排序是比较直观的排序算法之一,这里就使用选择排序实现单链表的排序. C实现代码如下: Li ...

  3. 用一个单链表L实现一个队列(算法导论第十章10.2-3)

    用一个单链表L实现一个队列(算法导论第十章10.2-3) template<typename T> class HalfNode {public:T key;HalfNode* next; ...

  4. 用一个单链表L实现一个栈(算法导论第十章10.2-2题)

    用一个单链表L实现一个栈(算法导论第十章10.2-2题) template<typename T> class HalfNode {public:T key;HalfNode* next; ...

  5. python单链表操作_单链表的创建、增删改查等操作(Python实现)

    单链表的创建.增删改查等操作(Python实现) # 单链表 class Node: def __init__(self, elem): self.elem = elem self.next = No ...

  6. python 单链表是否有回路_第5章 第1节 链表

    ● 请你说出几种基本的数据结构, 参考回答: 常见的基本的数据结构有链表.栈.队列.树(只列出面试常考的基本数据结构) 1.链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链 ...

  7. python 单链表是否有回路_(Python3)数据结构--单链表之判断链表是否有环

    前言 有Python基础 有数据结构单链表基础,没接触过的可以看下面链接 https://blog.csdn.net/sf9898/article/details/104946291 原理和实现 有一 ...

  8. python单链表排序_奇数结点升序偶数结点降序的单链表排序(Python实现)

    题目 一个链表,奇数结点升序,偶数结点降序,要求变成一个全升序的链表. 例如:1->8->2->7->3->6->4->5,变为1->2->3-& ...

  9. python 单链表添加节点_黄哥Python:单链表的尾部插入方法

    单链表的尾部插入方法: 1.先判断头结点是不是为None 2.设置一个当前结点node,循环下一个结点,当node.next 为None 时,就到尾部,也就是找到插入点了. 请看下面Python 代码 ...

  10. python实现带头结点的单链表的就地逆置_带头结点的单链表就地逆置

    本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数.L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置 ...

最新文章

  1. 国内丨人工智能(AI)引发的中国经济新动能
  2. yolov5 soft_nms cluster_nms,cluster_SPM_nms,cluster_diounms,cluster_SPM_dist_nms,diou_nms
  3. 重载、重写(覆盖)、隐藏(重定义)
  4. 计算机网络可以把在区域上分散的单个,计算机网络技术及应用课后习题
  5. 2020国开c语言程序设计1075,代号1253国开点大2017年6月春季学期本科期末考试《C语言程序设计》试题及答案.pdf...
  6. mysql replace substring 字符串截取处理
  7. 中秋佳节,献上笔试题一道,祝各位事业蒸蒸日上!
  8. 二进制文件和文本文件区别-小白笔记
  9. Javase MINA框架
  10. 关于路由器配置直连路由和静态路由
  11. java实现ppt转图片、ppt转pdf
  12. implement在java中怎么用_JAVA中implement和extends的区别
  13. IntelliJ IDEA里面配置任何路径的时候路径里面的反斜杠分隔符变成了钱币符号
  14. (五)Latex特殊符号
  15. 病毒宏基因组学(Meta-virome)
  16. 让一维指针指向二维数组空间的方法!
  17. 10-4 查找至少选修两门课程的学生学号
  18. 连接HC-05与HC-06
  19. 渗透测试——joker靶场漏洞复现
  20. zemax场曲畸变图_《ZEMAX光学设计超级学习手册》一一2.4 像分析

热门文章

  1. CenterNet++ | CenterNet携手CornerNet终于杀回来了,实时高精度检测值得拥有!
  2. CVPR 2022|只用一张图+相机走位,AI就能脑补周围环境!
  3. 想要配置文件生效 需要通过添加到web.xml加载到内存中
  4. jQuery AJAX 方法
  5. IDEA Maven Mybatis generator 自动生成代码
  6. win下使用VM虚拟机安装Linux系统
  7. tp5 + 百度编辑器 +七牛云存储的实现办法
  8. Maven搭建webService (一) 创建服务端---使用main函数发布服务
  9. 第十五章 第十五章 异步A3C(Asynchronous Advantage Actor-Critic,A3C)-强化学习理论学习与代码实现(强化学习导论第二版)
  10. 【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别