荷兰国旗问题

Cousera Algorithms PartI第二周课后问答题,有这样一道题,当时没什么想法,直到学了第三周的归并排序,才弄明白要怎么做,这里记录一下自己的想法与最终代码。

问题描述

简而言之,这道题就是有红白蓝三种颜色的球共n个随机排列,而我们的任务就是将这n个球按红、白、蓝顺序排好。这也就是这道题名为荷兰国旗的原因,下图即为荷兰国旗,可谓生动形象。

这道题最大的难题就在于只允许迭代一次就将数组排列好,如果没有这样的要求,这道题就很简单了,只需要一个球一个球检验就是了。

解决办法

受归并排序的启发,我认为想解决这道题,我们需要3个指针,lo、hi、current,分别代表白球的起始点分界点、终止分界点、当前位置点。答题思路就是这样:首先建立一个长度为n的数组,lo、current位于数组0位,hi位于数组n-1位。如果当前位置我们检验出颜色为红色,而且lo=current,那么就将lo、current都加1。如果当前为红色,而且lo<current那就说明,在当前这颗红球的前面已经遇到了白球,为了将红球排到前面,我们需要另lo位置的球与current位置的球互换位置,同时将lo、current都向前1位。如果检测current为白球,那么lo保持不动,current加1。如果遇到蓝球那么,我们先要将其移动到数组的后部,我们就应该交换current和hi位置的元素,同时current保持不动(因为当前current位置的球还没有检验过,是之前hi位置的球),hi要向后移动一位,即将hi-1。这样最后就能够将数组按规定排好。

整理一下:

                红=1

                白=0

                蓝=2

                if (color(current)==1 && less(lo,current) )

                   swap(lo,current); // 互换位置

                    lo++;

                    current++;

                else if (color(currrent)==1 && color(lo)==1)

                   lo++;

                   current++;

                else if(color(current)==0)

                   current++;

                else if (color(current)==2)

                   swap(current,hi);

                   hi--;

简单拿草稿纸画一下就更清楚了

代码

import java.util.Arrays;
import edu.princeton.cs.algs4.StdRandom;
public class DutchNationalFlag { /* 荷兰国旗问题,有红白蓝三种小球在数组中随机排列,我们的目的是* 将三种球按红白蓝三种顺序排好,而且要求只遍历数组一次 */public static final int red = 0;public static final int white = 1;public static final int blue = 2;private int n;private int[] buckets;public DutchNationalFlag (int[] buckets){ // 创建一个数组n = buckets.length;this.buckets = buckets;}public void sort(){int lo = 0; // 白球的起始分界点int hi = n-1; // 白球的终止分界点int current = lo; //当前指针while (current <= hi){switch(color(current)){case red:if (current != lo) swap (current , lo);current ++;lo ++;break;case white:current ++;break;case blue:swap (current , hi);hi--;break;}}}private void swap(int a, int b) {// 交换两个位置的元素int temp = buckets[b];buckets[b] = buckets[a];buckets[a] = temp;}private int color(int c) {// 检测当前位置的颜色return buckets[c];}public static void main(String[] args) {int n = 10;int [] buckets = new int[n];for (int i = 0; i < n; i++){buckets[i] = StdRandom.uniform(3);}DutchNationalFlag s = new DutchNationalFlag (buckets);System.out .println(Arrays.toString(buckets));s.sort();System.out .println(Arrays.toString(buckets));}}

这门课我写的代码日后都会上传到我的github上:https://github.com/zhengmingzhang

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28551.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法:荷兰国旗问题

什么是荷兰国旗问题 荷兰国旗是由红白蓝3种颜色的条纹拼接而成&#xff0c;如下图所示&#xff1a; 假设这样的条纹有多条&#xff0c;且各种颜色的数量不一&#xff0c;并且随机组成了一个新的图形&#xff0c;新的图形可能如下图所示&#xff0c;但是绝非只有这一种情况&am…

快排-荷兰国旗

在使用partition-exchange排序算法时&#xff0c;如快速排序算法&#xff0c;我们会遇到一些问题&#xff0c;比如重复元素太多&#xff0c;降低了效率&#xff0c;在每次递归中&#xff0c;左边部分是空的(没有元素比关键元素小)&#xff0c;而右边部分只能一个一个递减移动。…

BUUCTF 荷兰宽带数据泄露

题目 RouterPassView RouterPassView官方下载-RouterPassView中文免费版-华军软件园 ​ RouterPassView,大多数现代路由器允许您备份到一个文件路由器的配置&#xff0c;然后从文件中恢复配置时的需要。路由器的备份文件通常包含了像您的ISP的用户名重要数据/密码&#xff0c…

荷兰国旗问题以及快速排序

文章目录 一、荷兰国旗问题1、啥是荷兰国旗问题2、荷兰国旗问题的抽象3、解决的思路4、详细的参考代码 二、快速排序1、啥是快排&#xff08;排序流程&#xff09;2、抽象后的快排流程3、详细的参考代码 大家好&#xff0c;我是周一。 最近几篇算法&#xff0c;我们都是聊的归…

拍卖理论 英式拍卖 和 荷兰式拍卖 是什么

拍卖理论 源自Vickrey&#xff08;1961&#xff09;的早期研究&#xff0c;其因此获得1996年的诺贝尔经济学奖。 目标一般为&#xff1a;拍卖人的收益最大化、社会的整体效率最优化 对科研和商业方面有非常价值 英式拍卖 又称增价拍卖。拍品的起拍价格即最低期望价格&#…

谈腾讯地图web api如何实现类似百度地图内置的城市切换、关键字输入提示功能

PC WEB端新增客户的时候需要填写客户地址和联系人信息&#xff0c;包括&#xff1a;省市区、街道、详细地址和经纬度以及联系人、固话和移动电话。获取客户地址信息之前用的是百度地图&#xff0c;由于小程序中客户拜访时&#xff0c;需要对客户进行定位、距离计算&#xff0c;…

数学系列 (二)自然数、分数、小数、算数、代数

从无到有 数的概念 出生不久的孩子你觉的他认识1、2、3类似的数字吗&#xff1f;应该都不知道&#xff0c;可见数字的概念也是随着我们人类成长逐渐认识到的&#xff0c;英国经济学创立者亚当斯密说“数是人类在精神上制造出来的最抽象的概念”&#xff0c;属于逻辑思维里面的…

html 省份,城市 选择器附效果图

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><link href"https://cdn.bootcss.com/bootstrap/3.3.7/css/boots…

深圳前海和后海的地理位置划分

前海后海的地理位置 前海和后海主要是相对于珠江口而言的&#xff0c;面向珠江口的为前海&#xff0c;背向珠江口的为后海或面向深圳湾的为后海。 前海知识拓展 https://www.sohu.com/a/490380431_124752

Python实现天气查询功能(外加Excel技巧)

昨天在网上发现了一个非常方便的天气API&#xff0c;就用Python试着用了一下。参数是挺少的&#xff0c;用起来也方便&#xff0c;但是那个城市代码确实是搞了我好长时间。 一、介绍 我们先来看一下实现的程序有什么功能&#xff1a; 功能也是非常简单的&#xff0c;输入城市…

找零钱问题——贪心算法

蓝桥杯——算法训练——找零钱 有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是&#xff0c;每个人手里只有一张钞票&#xff08;每张钞票的面值为25、50、100元&#xff09;&#xff0c;而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零&#xf…

c语言 贪心算法 找零钱,贪心算法-找零钱(C#实现)

找零钱这个问题很清楚,无非就是始终拿可以取的最大面值来找,最后就使得张数最小了,这个实现是在假设各种面值足够多的情况下。 首先拖出一个界面来,最下面是一个listbox控件 对应的代码:问题比较简单,有注释 using System; using System.Collections.Generic; using Syst…

仿秒秒测日历页面和部分功能

秒秒测&#xff1a; 这里的农历和宜忌我们用的是这个lunar类库 <?phprequire Lunar.php;use com\nlf\calendar\Foto; use com\nlf\calendar\LunarYear; use com\nlf\calendar\util\HolidayUtil; use com\nlf\calendar\Lunar; use com\nlf\calendar\Solar;// 实例化 $sol…

蓝桥杯-算法训练-找零钱

问题描述   有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是&#xff0c;每个人手里只有一张钞票&#xff08;每张钞票的面值为25、50、100元&#xff09;&#xff0c;而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零&#xff08;假设饭堂阿姨足…

蓝桥杯全排列扩展(找零钱问题-java详解)

题目&#xff1a; 有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是&#xff0c;每个人手里只有一张钞票&#xff08;每张钞票的面值为25、50、100元&#xff09;&#xff0c;而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零&#xff08;假设饭堂…

想搞钱,先培养商业思维!

昨天谈借助 ChatGPT 挣点房贷钱的时候&#xff0c;看评论区大家留言的时候&#xff0c;发现很多人不知道这个东西可以赚钱&#xff0c;或者说知道这个东西且也做了功课&#xff0c;无奈太忙最后也没搞到钱。 可以看到&#xff0c;大家的问题&#xff0c;归根于自己有没有商业思…

马云获聘香港大学荣誉教授;马斯克预计 2 个月内再次尝试发射星舰;​Rust 1.69.0 发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

中科院发布多模态 ChatGPT,图片、语言、视频都可以 Chat ?中文多模态大模型力作...

进NLP群—>加入NLP交流群 夕小瑶科技说 原创作者 | 小戏、ZenMoore在 GPT-4 的发布报道上&#xff0c; GPT-4 的多模态能力让人印象深刻&#xff0c;它可以理解图片内容给出图片描述&#xff0c;甚至能在图片内容的基础上理解其中的隐喻或推断下一时刻的发展。 无疑&#xf…

有没有哪个瞬间,让你突然对ChatGPT感到失望? | AIGC实践

不知道你是否和我一样&#xff0c;在第一次使用ChatGPT输入Prompt&#xff0c;并得到答复的那一刻&#xff0c;都会忍不住地赞叹一句&#xff1a;握草。 但随着时间慢慢拉长&#xff0c;体验不断深入&#xff0c;想法也会慢慢改变…… 主题图 by Midjourney。Prompt&#xff1a…

Linux系统调用(2.哈工大OS实验二)

Linux系统调用与哈工大实验二 实验要求 此次实验的基本内容是&#xff1a;在Linux 0.11上添加两个系统调用&#xff0c;并编写两个简单的应用程序测试它们。 具体实验细节可以参考蓝桥云&#xff1a; https://www.lanqiao.cn/courses/115/learning/?id374&compatibility…