Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[算法题] 荷兰国旗问题

[算法题] 荷兰国旗问题

作者头像
CoderJed
发布于 2019-02-25 03:28:59
发布于 2019-02-25 03:28:59
87300
代码可运行
举报
文章被收录于专栏:Jed的技术阶梯Jed的技术阶梯
运行总次数:0
代码可运行

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代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.01.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大厂高频手撕算法题
目前互联网行业目前正在处于内卷状态,各个大厂不断提高招人门槛,前端工程师找工作也越发艰难,为了助力各位老铁能够在面试过程中脱颖而出,我结合自己的面试经验,准备了这三十六道面试过程中的手撕算法题,与各位共享。 一、冒泡排序 冒泡排序的思路:遍历数组,然后将最大数沉到最底部; 时间复杂度:O(N^2); 空间复杂度:O(1) function BubbleSort(arr) { if(arr == null || arr.length <= 0){ return []; }
前端迷
2020/09/30
1.1K0
大厂高频手撕算法题
[图解] 快速排序
经典快速排序总是指定数组或者某部分的最后一个元素作为基准值,随机快速排序指定数组或者某一部分中的随机值作为基准值。
CoderJed
2019/02/25
1.2K0
[图解] 快速排序
【漫画】不要再问我快速排序了
一禅:归并排序是一种基于分治思想的排序,处理的时候可以采取递归的方式来处理子问题。我弄个例子吧,好理解点。例如对于这个数组arr[] = { 4,1,3,2,7,5,8,0}。
帅地
2018/12/13
5050
荷兰国旗-快排应用
”荷兰国旗难题“是计算机科学中的一个程序难题,它是由Edsger Dijkstra提出的。荷兰国旗是由红、白、蓝三色组成的。
sr
2018/08/20
5990
荷兰国旗-快排应用
Java的几种经典排序算法
对一个排序算法来说,一般从如下3个方面衡量算法的优劣: 时间复杂度:主要是分析关键字的比较次数和记录的移动次数。 空间复杂度:分析排序算法中需要多少辅助内存。 稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种算法是稳定的;反之,就是不稳定的。
程序员云帆哥
2022/05/12
2670
Java的几种经典排序算法
【优选算法篇】揭秘快速排序:分治算法如何突破性能瓶颈(上篇)
分治法是一种非常高效的算法设计策略,广泛应用于计算机科学的多个领域,尤其是在解决复杂问题时,它通过将大问题拆解成更小的子问题来降低问题的复杂度。快速排序(QuickSort)是分治法中的经典例子,能够在许多实际场景中提升性能。它的重要性体现在以下几个方面:
熬夜学编程的小王
2024/12/24
840
【优选算法篇】揭秘快速排序:分治算法如何突破性能瓶颈(上篇)
【数据结构与算法】:交换排序之快速排序(手绘图解+LeetCode原题)
快速排序是交换排序的一种,本质上快速排序就是采用“分而治之”的策略(分治法),将问题规模减小,再而对问题分别进行处理的排序算法。
.29.
2022/11/15
3480
【数据结构与算法】:交换排序之快速排序(手绘图解+LeetCode原题)
漫画:常考的荷兰国旗问题你还不会吗?(初级)
"荷兰国旗问题" 是计算机科学中的一个经典题目,它是由Edsger Dijkstra提出的。荷兰国旗由红、白、蓝三色组成。
程序员小浩
2020/05/08
5K1
手敲一遍排序算法 Java
**稳 定:**插冒归计基(简单插入排序、冒泡排序、归并排序、计数排序、基数排序)
小锋学长生活大爆炸
2020/12/08
3470
面试中的排序算法(Part 2)
今天我们介绍两个复杂点的排序算法随机快排和希尔排序,这也是面试的重点,考察范围包括代码书写,复杂度分析以及稳定性比较!好吧,让我们开始今天的算法之旅吧!
算法工程师之路
2019/08/05
4890
【Java数据结构和算法】012-排序:快速排序*、归并排序*、基数排序(桶排序)、堆排序、排序算法比较
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列;
訾博ZiBo
2025/01/06
820
【Java数据结构和算法】012-排序:快速排序*、归并排序*、基数排序(桶排序)、堆排序、排序算法比较
【leetcode】拆解与整合:分治并归的算法逻辑
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
用户11288949
2025/03/30
920
【leetcode】拆解与整合:分治并归的算法逻辑
算法从小白到大神之荷兰国旗问题&快排&堆排 顶
给定一个数组arr,和一个数num,请把小于等于num的数放在数 组的左边,大于num的数放在数组的右边。 要求额外空间复杂度O(1),时间复杂度O(N) 问题二(荷兰国旗问题) 给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放在数组的中间,大于num的数放在数组的 右边。 要求额外空间复杂度O(1),时间复杂度O(N)
须臾之余
2019/08/23
1.3K0
算法从小白到大神之荷兰国旗问题&快排&堆排
                                                                            顶
①归并排序、快速排序 、堆排序、计数排序[算法、代码模板、面试题]
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~
.29.
2023/12/06
4110
①归并排序、快速排序 、堆排序、计数排序[算法、代码模板、面试题]
面试官爱问的10大经典排序算法,20+张图来搞定
冒泡排序是因为越小的元素会经由交换以升序或降序的方式慢慢浮到数列的顶端,就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名冒泡排序。
C语言与CPP编程
2021/05/18
5380
面试官爱问的10大经典排序算法,20+张图来搞定
数据结构与算法-十大排序算法(动画演示)
不稳定:如果a原本在b的前面,而a = b,排序之后 a 可能会出现在 b 的后面。
越陌度阡
2020/11/26
7530
数据结构与算法-十大排序算法(动画演示)
七大经典、常用排序算法的原理、Java 实现以及算法分析
大家好,我是多选参数的程序锅,一个正在 neng 操作系统、学数据结构和算法以及 Java 的硬核菜鸡。数据结构和算法是我准备新开的坑,主要是因为自己在这块确实很弱,需要大补(残废了一般)。这个坑以排序为开端,介绍了 7 种最经典、最常用的排序算法,分别是:冒泡排序、插入排序、选择排序、归并排序、快速排序、桶排序、计数排序、基数排序。对应的时间复杂度如下所示:
syy
2020/06/23
7380
【优选算法篇】化繁为简,见素抱朴:从乱象中重构秩序的艺术
给定一个包含红色、白色和蓝色的数组 nums,共 n 个元素,要求对它们进行原地排序,使得相同颜色的元素相邻,并按红色、白色、蓝色的顺序排列。这里使用整数 0、1 和 2 分别表示红色、白色和蓝色,且不能使用库的排序函数。
半截诗
2024/11/21
710
【优选算法篇】化繁为简,见素抱朴:从乱象中重构秩序的艺术
【算法】快速排序及优化
其实,这就是快排的partition过程,通过三个指针,index,less,more进行的,初始less=左边界-1,more=右边界+1,说明一开始不存在less域和more域: 1)若arr[index] < num,less域增加,即less++,然后index和less位置的数交换后,index++继续指向下一个数 2)若arr[index] > num,more域增加,即more++,然后index和more的数交换后,继续判断交换后arr[index]和num的关系 3)若arr[index] == num,index++继续指向下一个数,不坐任何处理 4)重复以上过程,直至index==more
MapleYe
2020/03/28
4290
二分查找团灭力扣旋转排序数组系列
Leetcode 中有一系列旋转排序数组相关的问题,例如33. 搜索旋转排序数组、81. 搜索旋转排序数组 II、153. 寻找旋转排序数组中的最小值、154. 寻找旋转排序数组中的最小值 II 和面试题10.03 搜索旋转数组等,本文介绍通过二分查找团灭这一系列问题,供大家参考,希望能对大家有所帮助。
程序员小熊
2021/05/28
5800
二分查找团灭力扣旋转排序数组系列
推荐阅读
相关推荐
大厂高频手撕算法题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验