【颜色分类】

news2024/11/14 2:58:04

75. 颜色分类

题目描述

给定一个包含红色、白色和蓝色,共 n 个元素的数组 nums,需要原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。这里使用整数 012 分别表示红色、白色和蓝色。并且要求必须在不使用库内置的 sort 函数的情况下解决该问题。

示例

示例1

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

示例2

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

提示

  1. n == nums.length
  2. 1 <= n <= 300
  3. nums[i]012

进阶要求

能想出一个仅使用常数空间的一趟扫描算法吗?

七、解题思路

(一)双指针法(左右指针)

  • 思路
    • 我们可以使用两个指针,一个左指针 left 指向数组的开头,一个右指针 right 指向数组的末尾。左指针用来寻找非红色(即 12)的元素,右指针用来寻找非蓝色(即 01)的元素。
    • 然后从数组的开头开始遍历,当遇到 0 时,将其与左指针指向的元素交换,因为左指针左边的元素应该都是 0(红色),这样就保证了红色元素在数组的左边部分逐渐增多;当遇到 2 时,将其与右指针指向的元素交换,因为右指针右边的元素应该都是 2(蓝色),这样就保证了蓝色元素在数组的右边部分逐渐增多。
    • 对于遇到的 1,不需要进行交换操作,因为 1(白色)本来就是在中间的位置,随着 02 的交换,1 会自然地处于正确的位置。

(二)单指针法(一趟扫描算法,满足进阶要求)

  • 思路
    • 定义一个指针 curr,初始时指向数组的开头。再定义两个变量 zero_endtwo_start,分别用来记录 0 的末尾位置和 2 的起始位置(初始时都为 0)。
    • 从数组的开头开始遍历,当遇到 0 时,将其与 curr 指向的元素交换,并且更新 zero_endcurr 的位置,然后 curr 向前移动一位;当遇到 2 时,将其与 curr 指向的元素交换,并且更新 two_startcurr 的位置,但是这里 curr 不移动,因为交换过来的元素可能是 01,需要再次判断。当遇到 1 时,curr 直接向前移动一位。
    • 通过这样一趟扫描,就可以将数组中的元素按照红色、白色、蓝色的顺序排列好,并且只使用了常数空间。

八、代码实现

(一)双指针法

def sortColors(nums):
    left = 0
    right = len(nums) - 1
    i = 0
    while i <= right:
        if nums[i] == 0:
            nums[i], nums[left] = nums[left], nums[i]
            left += 1
            i += 1
        elif nums[i] == 2:
            nums[i], nums[right] = nums[right], nums[i]
            right -= 1
        else:
            i += 1
    return nums

(二)单指针法(一趟扫描算法)

def sortColors(nums):
    curr = 0
    zero_end = 0
    two_start = len(nums)
    while curr < two_start:
        if nums[curr] == 0:
            nums[curr], nums[zero_end] = nums[zero_end], nums[curr]
            zero_end += 1
            curr += 1
        elif nums[curr] == 2:
            nums[curr], nums[two_start - 1] = nums[two_start - 1], nums[curr]
            two_start -= 1
        else:
            curr += 1
    return nums

九、测试用例

(一)双指针法

测试用例1

输入nums = [2, 0, 2, 1, 1, 0]
预期输出[0, 0, 1, 1, 2, 2]

测试用例2

输入nums = [2, 0, 1]
预期输出[0, 1, 2]

测试用例3

输入nums = [0, 1, 2, 2, 1, 0]
预期输出:[0, 0, 1, 1, 2, 2]

(二)单指针法(一趟扫描算法)

测试用例1

输入nums = [2, 0, 2, 1, 1, 0]
预期输出:[0, 0, 1, 1, 2, 2]

测试用例2

输入nums = [2, 0, 1]
预期输出:[0, 1, 2]

测试用例3

输入nums = [0, 1, 2, 2, 1, 0]
预期输出:[0, 0, 1, 1, 2, 2]

十、测试结果

通过对上述测试用例的测试,两种方法的代码都能够正确地对给定数组进行排序,满足题目要求。双指针法和单指针法(一趟扫描算法)在不同的应用场景下都可以有效地解决颜色分类问题。

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

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

相关文章

新手 Vue 项目运行

前言&#xff1a;前面讲了我们已经将spingboot项目运行起来了&#xff0c;现在我们只需将后台管理的Vue项目运行起来即可完成整个项目。 在运行vue项目之前&#xff0c;请先运行springboot项目&#xff0c;运行步骤请看&#xff1a;运行Springboot Vue 项目_springbootvue项目…

AUTOSAR_EXP_ARAComAPI的7章笔记(2)

☞返回总目录 相关总结&#xff1a;服务发现实现策略总结 7.2 服务发现的实现策略 如前面章节所述&#xff0c;ara::com 期望产品供应商实现服务发现的功能。服务发现功能基本上是在 API 级别通过 FindService、OfferService 和 StopOfferService 方法定义的&#xff0c;协议…

计算机网络分析题

网络的布置 根据具体需求布置网络 第二小题、网络的划分 根据路由表作出路由器拓扑图 ARP跨网络寻址 TCP报文段格式概念 网桥的转发表与动作 网络嗅探报文 十六进制化作十进制 嗅探以太网帧首部 除MAC帧以外&#xff0c;其他各层协议数据单元都是源地址在前&#xff0c;目…

【初阶数据结构与算法】线性表之链表的分类以及双链表的定义与实现

文章目录 一、链表的分类二、双链表的实现1.双链表结构的定义2.双链表的初始化和销毁初始化函数1初始化函数2销毁函数 3.双链表的打印以及节点的申请打印函数节点的申请 4.双链表的头插和尾插头插函数尾插函数 5.双链表的查找和判空查找函数判空函数 6.双链表的头删和尾删头删函…

【AI写作宝-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

【HarmonyNext】显示提示文字的方法

【HarmonyNext】显示提示文字的方法 本文介绍在 HarmonyNext 中显示提示文字的两种常见方法&#xff1a;使用自定义弹窗 CustomDialog 和使用 promptAction 的 showToast 方法。 一、使用自定义弹窗 CustomDialog 在 HarmonyNext 中&#xff0c;自定义弹窗是实现复杂提示信…

【3D Slicer】的小白入门使用指南

一、3D Slicer认识 3D Slicer是一个开源医学影像分析和可视化平台(本质是TotalSegmentator的软件版)。(补充:TotalSegmentator 是一个用于医学图像分割的开源工具,能够对104种解剖结构进行精确分割。该项目基于深度学习技术,支持CT和MR图像的处理。TotalSegmentator 提供…

ts定义接口返回写法

接口&#xff08;未进行ts定义&#xff09; export async function UserList(params: {// keyword?: string;current?: number;pageSize?: number;},// options?: { [key: string]: any }, ) {return request<API1.UserList>(http://geek.itheima.net/v1_0/mp/artic…

.NET Core 应用程序如何在 Linux 中创建 Systemd 服务 ?

.NET Core 和 Linux 已经成为一个强大的组合&#xff0c;为开发人员提供了一个灵活、高性能的平台来构建和运行应用程序。在 Linux 上部署 .NET Core 应用程序的一个关键方面是利用 systemd 服务来确保应用程序顺利运行&#xff0c;在开机时自动启动&#xff0c;并在失败后重新…

低代码平台总览

低代码平台&#xff08;Low-Code Platform&#xff09;是一种软件开发工具&#xff0c;它允许用户通过图形化界面和少量的编码来快速构建应用程序。低代码平台的核心理念是通过抽象和最小化手工编码的方式&#xff0c;加速软件开发和部署的过程。以下是低代码平台的一些关键特性…

分布式----Ceph部署(上)

目录 一、存储基础 1.1 单机存储设备 1.2 单机存储的问题 1.3 商业存储解决方案 1.4 分布式存储&#xff08;软件定义的存储 SDS&#xff09; 1.5 分布式存储的类型 二、Ceph 简介 三、Ceph 优势 四、Ceph 架构 五、Ceph 核心组件 #Pool中数据保存方式支持两种类型&…

华为诺亚方舟新作:GUI Agent综述

1、摘要 智能代理可以做更复杂的任务。特别是模拟人类在GUI上进行交互&#xff0c;比如点击和打字。 本论文对此进行总结&#xff0c;特别是其中最关键的数据、框架和应用。 首先是数据集和基准。 其次是统一框架&#xff0c;涵盖了关键组件和分类体系。 此外是基于MLLM的GUI…

(65)使用RLS自适应滤波器进行信道均衡的MATLAB仿真

文章目录 前言一、仿真说明二、码间串扰、色散、与频率选择性衰落1. 码间串扰&#xff08;ISI&#xff09;2. 信道的色散与码间串扰3. 减少ISI的方法 三、MATLAB仿真代码四、仿真结果1.发送16QAM信号的星座图2.信道的频率响应3.接收16QAM信号的星座图4.均衡后16QAM信号的星座图…

数据结构与算法:双指针之“最长连续不重复子序列” +位运算之“求二进制中第k个数字”、“求二进制表示”、“二进制中1的个数” +整数离散化

双指针&#xff1a; 简介 常见问题分类&#xff1a; 对于一个序列&#xff0c;用两个指针维护某一段特定的区间 对于两个序列&#xff0c;维护某种次序&#xff08;譬如归并排序中合并两个有序序列的操作&#xff09; 双指针算法的最核心点在于&#xff0c;将O(N^2)的暴力…

东方通TongWeb替换Tomcat的踩坑记录

一、背景 由于信创需要&#xff0c;原来项目的用到的一些中间件、软件都要逐步替换为国产品牌&#xff0c;决定先从web容器入手&#xff0c;将Tomcat替换掉。在网上搜了一些资料&#xff0c;结合项目当前情况&#xff0c;考虑在金蝶AAS和东方通TongWeb里面选择&#xff0c;后又…

kafka 的一些问题,夺命15连问后续

16、kafka是如何做到高效读写 因为kafka本身就是分布式集群&#xff0c;可以采用分区技术&#xff0c;并行度高 读取数据可以采用稀疏索引&#xff0c;可以快速定位要消费的数据&#xff08;mysql中索引多了以后&#xff0c;写入速度就慢了&#xff09; 可以顺序写磁盘&#…

使用 Node.js 了解 MVC 模式

模型-视图-控制器 &#xff08;MVC&#xff09; 模式是 Web 开发中最流行的架构模式之一。通过将应用程序划分为三个相互关联的组件&#xff08;模型、视图和控制器&#xff09;&#xff0c;MVC 促进了有组织、可维护和可扩展的代码。Node.js 具有异步处理和庞大的生态系统&…

flink 同步oracle11g数据表到pg库

1. 关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld systemctl status firewalldvi /etc/selinux/config 修改为disabled2.安装java8 yum list java-1.8* yum install java-1.8.0-openjdk* -yjava -version3.下载和部署postgresql 看需求安装pg库…

catchadmin-webman 宝塔 部署

1&#xff1a;宝塔的php 中删除禁用函数 putenv 问题&#xff1a; 按照文档部署的时候linux&#xff08;php&#xff09; vue (本地) 无法访问后端api/login 的接口 。 解决办法&#xff1a; webman 没有配置nginx 反向代理 配置就能正常访问了

【go从零单排】接口(interface)和多态(Polymorphism)

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在Go语言中&#xff0c;interface 是一种重要的类型&#xff0c;用于定义一组方法…