【LeetCode力扣】75 快速排序的子过程partition(荷兰国旗问题)

news2024/12/23 23:54:40

 

目录

1、题目介绍

2、解题思路

2.1、冒泡排序暴力破解

2.2、快速排序的子过程partition

2.2.1、详细过程描述

2.2.2、代码描述


 

1、题目介绍

原题链接:75. 颜色分类 - 力扣(LeetCode)

示例 1:

输入:nums = [2,0,2,1,1,0]

输出:[0,0,1,1,2,2]

示例 2:

输入:nums = [2,0,1]

输出:[0,1,2]

 提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i] 为 0、1 或 2

2、解题思路

根据题目的意思,简单来说就是将数组里的数据按照0、1、2的顺序排列。

如果只是要求排序,其实投机取巧的方式很多,比如直接使用冒泡排序也能完成此题。

2.1、冒泡排序暴力破解

void sortColors(int* nums, int sz) {
	int i = 0;
	int j = 0;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (nums[j] > nums[j + 1])
			{
				int tmp = nums[j];
				nums[j] = nums[j + 1];
				nums[j + 1] = tmp;
			}
		}
	}
}

冒泡排序:时间复杂度为O(n^2),空间复杂度为O(1)

2.2、快速排序的子过程partition

但是根据题目的难度标识为中等,很明显这道题不是在考察冒泡排序的。 

该题的难点在于如何原地遍历的情况下使得:时间复杂度为O(n),空间复杂度为O(1)。即仅使用常数空间的一趟扫描算法。

而这里就用到了快速排序的子过程partition,partition能够通过一次遍历将所有元素按照标志数进行划分,小于放标志数左边,大于放标志数右边。

首先这里有个数组,规定小num的值放在左侧,大于num的值放在右侧,而等于num的值放在中间,下面进行partition过程讲解。

首先蓝色方框是小于num的区域,橙色方框是大于num的区域,i从0开始循环遍历。

规则:

  1. 当arr[ i ]小于num时,arr[ i ]与小于区域的下一个元素交换位置,然后小于区域向右移动一位,i++。
  2. 当arr[ i ]等于num时,i++。
  3. 当arr[ i ]大于num时,arr[ i ]与大于区域的上一个元素交换位置,然后大于区域向左移动一位,此时i不自增
2.2.1、详细过程描述

首先arr[ i ] 等于3,小于5

【执行规则1】3与小于区域的下一位元素交换位置,而此时小于区域的下一个元素就是3,因此交换其实已经完成了。然后小于区域向右移动一位,i++。

 此时arr[ i ] 等于5

【执行规则2】直接 i++。

此时arr[ i ] 等于6,大于5

【执行规则3】3与大于区域的上一位元素交换位置,于是6和8交换位置。然后大于区域向左移动一位。

 此时arr[ i ] 等于8,大于5

【执行规则3】8与大于区域的上一位元素交换位置,于是8和第二个5交换位置。然后大于区域向左移动一位。

 此时arr[ i ] 等于5

【执行规则2】直接 i++。

 此时arr[ i ] 等于7,大于5

【执行规则3】7与大于区域的上一位元素交换位置,于是7和第二个3交换位置。然后大于区域向左移动一位。

此时arr[ i ] 等于3,小于5

【执行规则1】3与小于区域的下一位元素交换位置,于是第一个5和第二个3交换位置。然后小于区域向右移动一位,i++。

 此时arr[ i ] 等于4,小于5

【执行规则1】4与小于区域的下一位元素交换位置,于是第一个5和4交换位置。然后小于区域向右移动一位,i++。

此时i遇到了大于区域了,就停止执行,此时数组中的值就变成了左边小右边大中间等于。

2.2.2、代码描述

按照快速排序的子过程partition的方法,改造代码 ,使标志数为1,然后将小于1的放左边,大于1的放右边,既完成排序。

void sortColors(int* nums, int numsSize){
    int signal  =  1;  //标志数
    int i = 0;
    int left = -1; //left为下标,是小于区域的右边界,刚开始还未进入数组,因此为-1
    int right = numsSize; //right为下标,是大于区域的左边界,刚开始还未进入数组,因此为numsSize
    while(i<right)   //当i遇上大于区域时停止循环,此时就完成了排序
    {
        if(nums[i] < signal)  //当nums[i]小于标志数
        {
            int tmp = nums[left+1];   //交换小于区域的下一个元素
            nums[left+1] = nums[i];
            nums[i] =  tmp;
            left++;
            i++;
        }
        else if(nums[i] > signal)  //当nums[i]大于标志数
        {
            int tmp = nums[right-1];  //交换大于区域的上一个元素
            nums[right-1] = nums[i];
            nums[i] = tmp;
            right--;
            
        }
        else
        {
            i++;   //等于时直接i++
        }
    }
}

快速排序的子过程partition:时间复杂度为O(n^2),空间复杂度为O(1) 

 

 

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

名城优企游学:全球智能物联领军企业-海康威视的创新发展之道

海康威视在安防、智能物联领域耕耘行业二十余年&#xff0c;其在全球视频监控设备的市场份额连续蝉联全球第一&#xff0c;业务覆盖全球150多个国家和地区。 近日&#xff0c;纷享销客【名城优企系列游学】活动携手30企业家走进全球智能物联领军企业——海康威视。聆听行业标杆…

hutool实现文件上传与下载

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency> 文件上传需要创建一个表 Autowiredprivate SysFileInfoMapper sysFileInfoMapper;Value("${ty.…

微信小程序底部tabBar不显示图标

现场还原 在设置微信小程序底部tabBar导航图标时&#xff0c;无论如何操作均无法显示在界面上 解决思路 问题1 图标类型 一开始以为不支持png类型&#xff0c;但查看官方API仅提示ICON尺寸大小 打开其他项目可以正常展示&#xff0c;排除图标类型问题 iconPath string 否 …

犯了这些错误吗?20%的Spring声明式事务可能有问题

今天&#xff0c;我来和你聊聊业务代码中与数据库事务相关的坑。 Spring针对Java Transaction API (JTA)、JDBC、Hibernate和Java Persistence API (JPA)等事务API&#xff0c;实现了一致的编程模型&#xff0c;而Spring的声明式事务功能更是提供了极其方便的事务配置方式&…

RSS和Atom文档怎么打开?RSS新闻阅读软件Reeder5功能特点介绍

一款Mac上最优秀的RSS阅读器 支持本地RSS和Feedbin、Feedly、NewsBlur、Feed Wrangler、FeedHQ 等在线订阅服务 多种风格&#xff0c;多种布局 / 支持 iCloud 同步 自动阅读器视图 / 仿生阅读 / 支持第三方服务 新增功能 新的仿生阅读模式 与iCloud同步的应用内读取后续服务 …

golang/云原生/Docker/DevOps/K8S/持续 集成/分布式/etcd 教程

3-6个月帮助学员掌握golang后端开发岗位必备技术点 教程时长: 150小时 五大核心专栏,原理源码案例分析项目实战直击工作岗位 golang&#xff1a;解决go语言编程问题 工程组件&#xff1a;解决golang工程化问题 分布式中间件&#xff1a;解决技术栈单一及分布式开发问题 云原生…

电商(淘宝京东1688)API接口和ERP选品之间存在一定的关系

API接口是一种用于在应用程序之间进行数据交互和通信的标准化协议&#xff0c;而ERP&#xff08;企业资源计划&#xff09;系统是一种综合性的管理软件&#xff0c;可以帮助企业进行采购、销售、库存等业务流程的自动化管理。 在ERP选品方面&#xff0c;API接口可以用于从外部…

【实用小工具】一键分离音频中的纯人声~

音分轨——能够一键分离出音频中的【人声】和【音乐】&#xff0c;并单独输出为新的音频文件。可以用来扒谱、提取人声、消除背景音等。 第一步&#xff1a;打开【音分轨】APP&#xff0c;进入首页点击【人声分离】 第二步&#xff1a;选择导入方式&#xff0c;上传需要提取伴…

yolov5中的位置损失到底有哪些?

目录 1.IOU loss 2.GIOU 3.DIOU和CIOU 5.SIOU 6.EIOU 7.WIOU 8.MPDIOU 别人问目标检测有几个损失函数&#xff1f; 我答&#xff1a;三个。 别人笑了笑。 我问&#xff1a;难道我说记错了&#xff1f; 别人说&#xff1a;是的&#xff0c;你记错了。 我说&#xff…

Python学习 — 免费使用,无须激活,下载安装即可免费使用Pycharm教程

学生如何通过自己的学校邮箱账号来免费使用专业版Pycharm&#xff0c;无需激活下载与安装、配置Python解释器教程。 前言&#xff1a; Pycharm官网版本是有两个版本的, 第一个版本是Professional(专业版本)&#xff0c;这个版本功能更加强大&#xff0c;主要是为Python和web开…

[vxe-table] 合并行后滚动错位

使用vxe-table的属性:span-method合并行&#xff0c;之后下拉后会错位 原因&#xff1a;缺少配置 scroll-y"{enabled: false}"参考&#xff1a; vxe-table合并行后错位

Maven如何将JAR包上传至本地仓库及私服

前言 为什么需要上传jar包至maven仓库&#xff1f; maven官方仓库有些依赖并不存在&#xff0c;现在项目都是maven直接获取jar&#xff0c;当maven获取不到时&#xff0c;或者需要引入外部jar包依赖时&#xff0c;就需要我们把jar上传至maven仓库。 示例&#xff1a;demo.jar…

好用的思维导图软件Xmind Pro 中文专业安装

XMind是一款非常实用的商业思维导图软件&#xff0c;应用领域广泛&#xff0c;为帮助用户提高工作效率而生。它融合了全球先进的管理理念和一线设计思想&#xff0c;具有强大的功能和优雅的界面&#xff0c;用户可以根据自己的需求自由定制。 好用的思维导图软件Xmind Pro 中文…

【AN基础工具—动画人物绘制】

【AN基础工具——动画人物绘制】 基本操作绘制直线选择工具基本图形钢笔工具 实战 本篇内容&#xff1a;动画人物绘制基础 重点内容&#xff1a;选择工具&#xff0c;线条&#xff0c;钢笔工具 工 具&#xff1a;Adobe Animate 2022 基本操作 绘制直线 选择《直线工具&#x…

2023-10-09 LeetCode每日一题(最小和分割)

2023-10-09每日一题 一、题目编号 2578. 最小和分割二、题目链接 点击跳转到题目位置 三、题目描述 给你一个正整数 num &#xff0c;请你将它分割成两个非负整数 num1 和 num2 &#xff0c;满足&#xff1a; num1 和 num2 直接连起来&#xff0c;得到 num 各数位的一个排…

即时编译jit和xbyak的基本使用介绍

一般来说&#xff0c;解释型编程语言都是依靠自身运行的虚拟机&#xff0c;在解释程序。有时候语言为了提高运行速度&#xff0c;不会去直接解释程序文本&#xff0c;而是模拟cpu执行方式&#xff0c;将文本代码执行一次翻译&#xff0c;翻译为类似cpu执行的汇编语言去执行。有…

树 | 选择题

1. 若X是二叉树中序线索树中一个有左孩子的结点&#xff0c;且X不为根&#xff0c;则X的前驱为 X的双亲 X的右子树中最左的结点 X的左子树中最右结点&#xff08;正确答案&#xff09; X的左子树中最右叶结点&#xff08;可能没有&#xff09; 这里不是前驱结点&#xff0…

IDEA的使用(四)创建不同类型的工程(IntelliJ IDEA 2022.1.3版本)

1. 创建Java工程 创建之后&#xff0c;src下是空的。可以在src下创建软件包Package&#xff0c;命名采用域名倒序。在软件包下再创建Java类。Java类运行后出现中文乱码&#xff0c;就到控制台和文件编码这两个地方设置编码。 2. 创建JavaWeb工程 2.1 在win11和IDEA中配置Tomca…

Linux高性能服务器编程 学习笔记 第十三章 多进程编程

我们将讨论Linux多进程编程的以下内容&#xff1a; 1.复制进程映像的fork系统调用和替换进程映像的exec系列系统调用。 2.僵尸进程以及如何避免僵尸进程。 3.进程间通信&#xff08;Inter Process Communication&#xff0c;IPC&#xff09;最简单的方式&#xff1a;管道。 …

使用EasyDarwin+ffmpeg+EasyPlayerPro完成rtsp的推流操作和拉流操作

本文分享在做视频类测试过程中所用到的工具EasyDarwinffmpegEasyPlayerPro 首先说一下EasyDarwin,简单来讲&#xff0c;它就是个推流和拉流及系统消耗的监测软件&#xff0c;具体使用方法我会写在下方。 EasyDarwin 1、解压下载好的EasyDarwin压缩包&#xff0c;并找到EasyD…