高频面试考题:荷兰旗问题

简介: 荷兰旗问题又称三色排序,或者彩虹排序,

image.png


荷兰旗问题又称三色排序,或者彩虹排序,


image.png


因为荷兰旗就三种颜色嘛,那这道题的问题就是给你三种颜色,按照给定的顺序排好。

当然了,题目的问法各种各样,有的给数字,有的给字母,但本质都是一样的。


比如给你一个只含有三个数字的数组:312312312231111122113,


要求按照 1 2 3 的顺序排好,即:


111111111222222222223333333333


(请不要真的去数数,认真你就输了)


image.png


image.png


image.png


还是用我们经典的「挡板法」。


在快排中,我们用了两个挡板把数组分成三个区域:


<= pivot;未排序区间;> pivot


那么这里就要三个挡板,分成四个区域:


1, 2, 3, 未排序区间


Partition


具体说来,用 i, j, k 这三个指针分一下:


[0, i): 存 1


[i, j): 存 2


(k, array.length-1]: 存 3


这里 j 放在未排序区间的左边和右边都行,但基本上大家都是放左边,所以我们也没必要“标新立异”。


初始化:


i = 0;


j = 0;


k = array.length - 1;


这样才能保证 1,2,3 的每个区间都为空。


我们通过观察指针 j 指向的元素来不断缩小未排序区间,直到为空。


例子:1232312


image.png


为了好看,排好序的元素我们用 RGB 三原色标示一下。


Step1.


指针 j 指向 1,而 1 应该放在 [0, i) 区间内,


这里应该把指针 i 和指针 j 所指的元素交换一下,并且俩指针往前走。


虽然在这步看来是否交换没什么区别,但是如果 i 和 j 之间有元素,就有区别了,比如 Step7.


image.png


Step2.


指针 j 指向 2,而 2 应该放在 [i, j) 区间内,所以 j++.



image.png

Step3.


指针 j 指向 3,而 3 应该放在


(k, array.length-1] 区间内,所以这里


j 和 k 指向的元素交换一下,并且 k--.


注意这里就不能 j-- 了,因为新换回来的元素还没瞧呢,不知道它是几。


image.png


Step4.


指针 j 指向 2,同 Step2,直接移动指针 j 即可。


image.png


Step5.


继续移动指针 j。


image.png

Step6.


同 Step3.


image.png


Step7.


这一步就很明显看出来了,


由于 1 应该放在 [0,i) 区间,所以这里把指针 i,j 所指向的元素交换一下,并且 i++, j++.


image.png


这样未排序区间为空,我们就排好了~


image.png


image.png


时间复杂度


这个算法的 bottle neck 就在这个 while loop 里了,每次循环是 O(1),总共是 O(n).


空间复杂度


O(1)


image.png


今天的题目就到这里啦,你们还喜欢吗?还有什么想让我写的可以留言告诉我哦~


image.png


五月的最后一天,五月天只会迟到,但不会缺席。


看着今日的线上演唱会,让我想起上一次去五月天的演唱会,还是三年前他们来纽约的「人生无限公司巡回演唱会」,翻了翻朋友圈,历历在目。


image.png


新的一周,新的一月,祝大家节日快乐吖~


愿你我走出半生,归来仍是少年。

目录
相关文章
|
存储 自然语言处理 算法
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
|
5月前
|
存储 调度 C++
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
123 1
|
6月前
|
搜索推荐 开发工具 Python
2024年最新【Python 基础教程】对时间日期对象的侃侃而谈,面试必考题
2024年最新【Python 基础教程】对时间日期对象的侃侃而谈,面试必考题
2024年最新【Python 基础教程】对时间日期对象的侃侃而谈,面试必考题
|
6月前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
88 1
|
6月前
|
分布式计算 Java API
大数据Flink面试考题___Flink高频考点,万字超全整理(建议)
大数据Flink面试考题___Flink高频考点,万字超全整理(建议)
291 0
|
存储 算法 C++
【每日算法Day 84】面试必考题:Trie(字典树/前缀树)的实现
【每日算法Day 84】面试必考题:Trie(字典树/前缀树)的实现
|
前端开发 容器
🍊Flex布局最佳实践之骰子实战篇(面试高频考点,速来围观呀~)
🍊Flex布局最佳实践之骰子实战篇(面试高频考点,速来围观呀~)
639 6
🍊Flex布局最佳实践之骰子实战篇(面试高频考点,速来围观呀~)
|
消息中间件 NoSQL Java
高频Java面试题集锦(含答案),让你的面试之路畅通无阻!
或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信你一定不会“败”的很惨,因为有了它,足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的知识点了。 凡事预则立,不预则废。能读到这里的人,我相信都是这个世界上的“有心人”,还是那句老话:上天不负有心人!我相信你的每一步努力,都会收获意想不到的回报。
力扣206 - 反转链表【校招面试高频考题】
力扣206 - 反转链表,一道校招中笔试面试链表章节中【非常高频】的考题
77 0
力扣206 - 反转链表【校招面试高频考题】
|
存储 缓存 NoSQL
Redis缓存穿透和雪崩相关概念(面试高频,工作常用)
Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面,但同时,它也带来了一些问题,其中,最重要的问题,就是数据的一致性问题。从严格意义上讲,这个无解。如果对数据的一致性要求很高,那么就不能使用缓存。
153 0
Redis缓存穿透和雪崩相关概念(面试高频,工作常用)