荷兰国旗问题之快速分组
朋友们,现在我出一个非常简单的问题,给你一个数组,把它进行处理,变成左边小,中间相等,右边大的一个数组,如何解决呢,这里涉及到一个基本方法叫分组,今天咱们不解决这个问题,只了解下,分组算法的基本思想。
代码很简洁,如下:
public static int partition(int[] arr, int L, int R) {if (L > R) {return -1;}if (L == R) {return L;}int lessEqual = L - 1;int index = L;while (index < R) {if (arr[index] <= arr[R]) {swap(arr, index, ++lessEqual);}index++;}swap(arr, ++lessEqual, R);return lessEqual;}
分区操作的目标是将一个数组分成两部分,一部分包含所有小于或等于某个元素的值,另一部分包含所有大于该元素的值。这个元素一般称为“分区元素”或“基准元素”。
以下是代码的详细解释:
public static int partition(int[] arr, int L, int R) {if (L > R) {return -1;}if (L == R) {return L;}int lessEqual = L - 1; // 初始化小于等于分区元素的区域的边界int index = L; // 初始化当前遍历的元素的索引,从左边界开始// 从左到右遍历数组,将小于等于分区元素的元素放在 lessEqual 区域while (index < R) {if (arr[index] <= arr[R]) {swap(arr, index, ++lessEqual); // 如果当前元素小于等于分区元素,将其与 lessEqual 区域的下一个元素交换位置}index++;}// 最后将分区元素与 lessEqual 区域的下一个元素交换位置,使分区元素位于正确的位置swap(arr, ++lessEqual, R);return lessEqual; // 返回分区元素的最终位置
}
示例:
让我们通过一个示例来演示这个分区操作。假设有一个数组 arr,内容如下:
arr = [7, 3, 9, 4, 6, 2, 8]
我们调用 partition(arr, 0, 6) 来分区这个数组,其中 L = 0 是左边界,R = 6 是右边界。这个示例的初始状态如下:
lessEqual初始化为L - 1 = -1,表示小于等于分区元素的区域为空。index初始化为L = 0,从数组的左边开始遍历
分区操作的过程如下:
-
index = 0,此时arr[index] = 7,因为7 <= 8(分区元素是最右边的元素),所以将7与arr[lessEqual + 1]交换,lessEqual变为0。 结果:arr = [7, 3, 9, 4, 6, 2, 8] -
index = 1,此时arr[index] = 3,因为3 <= 8,所以将3与arr[lessEqual + 1]交换,lessEqual变为1。 结果:arr = [7, 3, 9, 4, 6, 2, 8] -
index = 2,此时arr[index] = 9,因为9 > 8,不需要交换,index继续向右移动。 结果:arr = [7, 3, 9, 4, 6, 2, 8] -
依此类推,直到
index移动到6。 -
最后,将分区元素
8与arr[lessEqual + 1]交换,即8移动到了正确的位置。 结果:arr = [7, 3, 4, 6, 2, 8, 9]
分区操作结束,lessEqual 的值表示分区元素 8 的最终位置。在这个示例中,lessEqual 的值为 5,即分区元素 8 最终位于索引 5 的位置。
这就完成了一次分区操作,将数组分为两部分:左边是小于等于 8 的元素,右边是大于 8 的元素。
总结
上面主要是讲了荷兰国旗问题的一个小分支,这属于核心算法,具体如何实现整体的,大家可以自行查阅,其实这个算法可以自己去算一算,如果用一句话总结的话就是:给一个数组,最右侧的R是默认要划分的边界值,lessEqual记录小于等于R的最右侧边界索引,最后把R放到lessEqual的未知,再返回lessEqual的index。
相关文章:
荷兰国旗问题之快速分组
朋友们,现在我出一个非常简单的问题,给你一个数组,把它进行处理,变成左边小,中间相等,右边大的一个数组,如何解决呢,这里涉及到一个基本方法叫分组,今天咱们不解决这个问…...
只允许程序单实例运行
有时候,我们只能允许程序单实例运行,以免程序运行出错。可以通过使用App.PrevInstance和系统级的Mutex等多种办法来实现。 代码如下: 用户昵称: 留下些什么 个人简介: 一个会做软件的货代 CSDN网址:https://blog.csdn.net/zezes…...
巨人互动|Facebook海外户Facebook游戏全球发布实用策略
Facebook是全球最大的社交媒体平台之一,拥有庞大的用户基数和广阔的市场。对于游戏开发商而言,利用Facebook进行全球发布是一项重要的策略。下面小编将介绍一些实用的策略帮助开发商在Facebook上进行游戏全球发布。 巨人互动|Facebook海外户&Faceboo…...
【Java架构-版本控制】-Git进阶
本文摘要 Git作为版本控制工具,使用非常广泛,在此咱们由浅入深,分三篇文章(Git基础、Git进阶、Gitlab搭那家)来深入学习Git 文章目录 本文摘要1. Git分支管理2. Git分支本质2.1 分支流转流程(只新增文件)2.2 分支流转流…...
业务需要咨询?开发遇到 bug 想反馈?开发者在线提单功能上线!
大家是否遇到过下列问题—— 在开发的时候,遇到 bug 需要反馈… 有合作意向的时候,想更多了解业务和相关产品… 在接入的时候,需要得到专业技术支持… 别急,荣耀开发者服务平台在线提单功能上线了~ 处理问题分类说明࿱…...
MybatisPlus插件篇—逻辑删除+p6spy
文章目录 一、前言二、插件1、逻辑删除1.1、官方说明:1.2、配置依赖1.3、配置全局配置1.4、实体类字段上添加TableLogic注解1.5、验证是否成功 2、执行SQL分析打印2.1、配置依赖2.2、数据库驱动配置2.3、spy配置文件配置2.4、注意事项 三、总结提升 一、前言 本文将…...
Android studio中EditText设置默认值
如果想对EditText设置默认值,在java代码中使用setText函数是不行的,需要在layout文件中设置“text变量”,如下所示设置默认值为“192.168.1.1”: <EditTextandroid:id"id/car1_ip_edit"android:layout_width"1…...
《Java面向对象程序设计》学习笔记——第 13 章 泛型与集合框架
笔记汇总:《Java面向对象程序设计》学习笔记 # 第 13 章 泛型与集合框架 Java 提供了实现常见数据结构的类,这些实现数据结构的类通称为 Java 集合框架。 在 JDK1.5 后, Java 集合框架开始支持泛型,本章首先介绍泛型&#…...
python进阶--魔法方法之类的表示
下面的魔法方法都可以用了描述类 1、__str__ 该方法一般返回字符串,也许不会返回一个有效的 Python 表达式,但可以使用更方便或更准确的描述信息。在类中重写该方法,用来输出类的属性值等信息 调用:str(object)或者内置函数format()或者print()都会调用__str__()方法 c…...
JVM 创建对象时分配内存的几种方法、分配方法的选择
创建对象分配内存的方法 指针碰撞 假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那 个指针向空闲空间方向挪动一段与对象大…...
08-Vue基础之组件
个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。 🎅**学习目标: 坚持每一次的学习打卡 文章…...
Kotlin学习之密封类
Kotlin中的密封类: kotlin中的密封类,用关键词Sealed修饰,且还有一个规定:Sealed类的子类应该是Sealed类的嵌套类,或者应该在与Sealed类相同的文件中声明。 当我们想定义一个有相同父类,但是有不同子类的时候…...
opencv鼠标事件函数setMouseCallback()详解
文章目录 opencv鼠标事件函数setMouseCallback()详解1、鼠标事件函数:(1)鼠标事件函数原型:setMouseCallback(),此函数会在调用之后不断查询回调函数onMouse(),直到窗口销毁(2)回调函…...
硬件知识积累 USB 接口 type - A type - B type - C 的介绍与功能说明 (简单介绍)
1. USB 的介绍 1.1 USB 的定义 USB : 通用串行总线(英语: Universal Serial Bus,缩写:USB)是一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视&a…...
【LeetCode】290. 单词规律
这里写自定义目录标题 2023-8-30 09:34:23 290. 单词规律 2023-8-30 09:34:23 这道题目,我是根据 205. 同构字符串 的思路一样,都转化为另外一个第三方的字符串,在比较翻译过后的语句是不是一样的。 class Solution {public boolean wordP…...
研磨设计模式day12迭代器模式
目录 场景 解决方案 解决思路 代码示例 代码改造 Java实现迭代器 迭代器模式的优点 思考 何时选用 场景 大公司收购了一个小公司,大公司的工资系统采用List来记录工资列表,而小公司是采用数组,老板希望通过决策辅助系统来统一查看…...
Python3不支持sqlite3的解决方法
先贴报错: >>> import sqlite3 Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/usr/local/lib/python3.10/sqlite3/__init__.py", line 57, in <module>from sqlite3.dbapi2 impor…...
Qt应用开发(基础篇)——消息对话框 QMessageBox
一、前言 QMessageBox类继承于QDialog,是一个模式对话框,常用于通知用户或向用户提出问题并接收答案。 对话框QDialog QMessageBox消息框主要由四部分组成,一个主要文本text,用于提醒用户注意某种情况;一个信息文本informativeTex…...
ETC reset
ETC重新激活 换前挡风玻璃膜会把ETC设备拿下来,需要到【ETC服务中心】重新【粘上去】,另外需要工作人员用手持终端【重新激活】 ETC 背面有个 【白色】开关小柱子,一旦拆下来就失效,因为这个开关弹出来了 截面图看就是这样的&…...
2023年8月30日-[SWPUCTF 2021 新生赛]jicao
<?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;} ?> 包含了flag.php文件,设定了一个POST请求的id和…...
GPEN多场景实战落地:覆盖个人、企业、政府的图像增强应用
GPEN多场景实战落地:覆盖个人、企业、政府的图像增强应用 1. 引言:从模糊到清晰,AI如何重塑我们的视觉记忆 你有没有翻出过一张老照片,画面里的人脸模糊得只剩下轮廓,想看清细节却无能为力?或者ÿ…...
Claude Code每日更新速览(v2.1.90)-2026/04/02
本文前言: Claude Code 的进化速度,已经到了一种让人来不及消化的程度。根据 github.com/anthropics/claude-code/blob/main/CHANGELOG.md 获取最新的变更,跟紧 Claude Code新功能、新趋势。最新版本:v2.1.90提交时间:…...
【BUUCTF】MISC 弱口令实战:从安装Python库到LSB隐写破解全流程
1. 弱口令与LSB隐写技术入门 第一次接触CTF比赛时,我被各种隐写术搞得晕头转向。特别是遇到需要破解弱口令和LSB隐写的题目时,简直就像在黑暗中摸索。后来经过多次实战,终于总结出一套行之有效的方法。今天我就来分享从安装Python库到最终破解…...
别再用if-else了!用状态机重构你的51单片机红外循迹小车代码(思路+代码对比)
用状态机重构51单片机红外循迹小车:告别if-else的工程化实践 当你的红外循迹小车代码开始变得像意大利面条一样混乱时,是时候考虑一种更优雅的解决方案了。想象一下,每次需要新增一个传感器或者修改转向逻辑时,都要在几十个if-els…...
Qwen3-0.6B-FP8数据库智能查询:用自然语言生成SQL语句
Qwen3-0.6B-FP8数据库智能查询:用自然语言生成SQL语句 你有没有过这样的经历?面对一个数据库,明明知道数据就在里面,却因为不懂SQL而束手无策。想查“上个月哪个产品卖得最好”,或者“找出最近三个月复购率最高的客户…...
暗黑2终极增强:PlugY插件如何彻底改变你的单机游戏体验
暗黑2终极增强:PlugY插件如何彻底改变你的单机游戏体验 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 还在为暗黑破坏神2单机模式的种种限制而烦恼吗&am…...
Java函数计算迁移避坑清单:12个被官方文档隐瞒的关键限制(含Classloader隔离失效实录)
第一章:Java函数计算迁移避坑清单:12个被官方文档隐瞒的关键限制(含Classloader隔离失效实录)Java函数计算(如阿里云FC、AWS Lambda Java Runtime)在迁移传统Spring Boot应用时,常因底层沙箱机制…...
Qwen3.5-9B多模态能力解析:图文输入联合建模+VL变体兼容性说明
Qwen3.5-9B多模态能力解析:图文输入联合建模VL变体兼容性说明 1. 模型概述与核心能力 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,在多模态理解和长上下文处理方面展现出卓越性能。作为当前开源社区的重要贡献,该模型特别强化了图文联合…...
Wan2.2-I2V-A14B Java开发集成指南:SpringBoot后端服务调用
Wan2.2-I2V-A14B Java开发集成指南:SpringBoot后端服务调用 1. 引言 如果你是一名Java后端开发者,正考虑将AI视频生成能力集成到现有系统中,这篇教程就是为你准备的。我们将手把手教你如何在SpringBoot项目中调用私有化部署的Wan2.2-I2V-A1…...
Intv_AI_MK11 Anaconda数据科学环境配置:一站式AI研发平台搭建
Intv_AI_MK11 Anaconda数据科学环境配置:一站式AI研发平台搭建 1. 为什么选择Anaconda搭建AI开发环境 如果你刚开始接触AI开发,可能会被各种环境配置问题困扰。不同框架的版本兼容性、CUDA驱动安装、Python包依赖冲突...这些问题足以让新手望而却步。A…...
