【算法题】颜色分类,一文彻底搞会!

目录

一、题目描述

二、解题思路 

      1、什么是荷兰国旗问题?

       2、如何解决荷兰国旗问题?

三、参考答案


一、题目描述

        颜色分类

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

示例 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
进阶:
你能想出一个仅使用常数空间的一趟扫描算法吗?

二、解题思路 

        本题是一个经典的荷兰国旗问题。

      1、什么是荷兰国旗问题?

       "荷兰国旗问题"是计算机科学领域中的一个经典问题,由著名计算机科学家Edsger Dijkstra首次提出。该问题模型源于荷兰国旗的三色排列:红色、白色和蓝色。具体描述如下:假设有一系列球,分别涂有红色、白色和蓝色,这些球随机分布在一条直线上。荷兰国旗问题的目标是通过一种有效的方法对这些球进行排序,使得所有红色球位于最左侧,白色球居中,而蓝色球则位于最右侧,从而模拟荷兰国旗的水平条纹排列。

       2、如何解决荷兰国旗问题?

       荷兰国旗问题总共就三个颜色,所以我们想要区分开来,最少需要两条分隔线。这样,我们就可以定义两个分割线left、right,分割线left、right均包含白色,不包含红蓝色。left左边的是红色,右边是白色,right的左侧为白色,右侧为红色。在定义一个cur指针用来遍历每个球,根据球的颜色来决定它的位置。为了方便大家理解,如下就是一个演示过程:

       1)此时遍历的是红色,红色需要在left的左侧,所以需要移动分割线left,并且移动cur指针。

          2)此时遍历的是蓝色,蓝色需要在right的右侧,所以需要把当前cur指向的元素和分割线right所在的元素就行交换,并将分割线right左移,注意此时的cur不能移动,因为交换过来的元素并不知道他是什么颜色,所以也需要判断它的颜色,然后进行对应的操作。

          3)此时和步骤1)一样是红色,所以一样的处理方式。

       4)此时遍历的是白色,是在left的左边的,所以不需要移动分割线,只需要移动当前指针到下一个位置即可。

       5)此时遍历的是蓝色,所以和步骤2)一样的处理。

      6)经过步骤5)后当前指向的元素虽然还是蓝色,但是右分割线的位置已经往左移动了。此时还是继续和步骤2)一样的处理。

    7)当前遍历的元素是白色,所以直接不做任何处理,只移动cur指针到下一位。

    8)当前遍历的元素是红色,是不是还是应该像步骤1)一样直接往右移动分割线left,再将cur移向下一个元素呢?显然是不行的,此时,我们需要将cur指向的元素和分割线left所在位置的元素进行交互,然后在分别向右移动分割线left和cur指针。所以,当我们遍历到白色的时候,也是和遍历到蓝色一样需要加一个交换操作的。不同的是蓝色不需要移动当前指针cur,而白色需要移动当前指针cur(白色需要移动当前指针是因为,在cur指针左侧的都是判断过的,不需要再判断了)。

     9)当前指针cur和分割线right相遇,也就是预示着处理完成。这时候也可以看到,我们已经完成了红白蓝的排序。

 

三、参考答案

         本题其实就是荷兰国旗问题,此题的0其实就是荷兰国旗问题中的红色,1就是白色,2就是蓝色。按照上述分析的过程,不难写出如下代码:

class Solution {public void sortColors(int[] nums) {// 经典的荷兰国旗问题int l = 0, cur = 0, r = nums.length - 1;while (cur <= r) {if (nums[cur] == 0)swap(nums, l++, cur++);else if (nums[cur] == 1)cur++;elseswap(nums, cur, r--);}}// 定义交换数组的方法private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

        此时的时间复杂度就是O(n),而空间复杂度便是达到了O(1),也就是满足了题目中的进阶的要求。

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

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

相关文章

【电源专题】结合锂电池相关资料和华为手机聊聊锂离子电池使用条件限制

在文章:【电源专题】锂电池的特点和工作原理 中我们讲到了一些关于锂电池种类和特点、工作原理等。但是对于锂离子电池使用条件限制却没有介绍,本文基于手机产商 锂离子电池使用条件-电池性能和应用介绍 | 华为官网 (huawei.com)提供的介绍文档再次深入学习锂离子电池的一些特…

浅析JWT原理及牛客出现过的相关面试题

原文链接&#xff1a;https://kixuan.github.io/posts/f568/ 对jwt总是一知半解&#xff0c;而且项目打算写个关于JWT登录的点&#xff0c;所以总结关于JWT的知识及网上面试考察过的点 参考资料&#xff1a; Cookie、Session、Token、JWT_通俗地讲就是验证当前用户的身份,证明-…

【SpringBoot】2 项目搭建

创建项目 1&#xff09;确实本地 jdk 版本 打开命令行窗口&#xff1a;快捷键 Windows R&#xff0c;输入 CMD&#xff0c;敲回车 执行命令&#xff1a;java -version 2&#xff09;在项目 clone 的位置创建 Spring Boot 项目&#xff0c;使用 Maven 进行依赖管理&#xff…

uniapp通过绝对路径解压zpi中的shpe转化为geojson

uniapp通过绝对路径解压zpi中的shpe转化为geojson async fileResult() {const filepath11 /storage/emulated/0/importData/Export_Output_6.zip;// Base64解码函数function base64ToArrayBuffer(base64) {const binaryString atob(base64.split(,)[1]);const len binaryStr…

【计算机网络】DHCP实验

一&#xff1a;实验目的 1&#xff1a;深入理解DHCP&#xff08;动态主机配置协议&#xff09;的工作原理和数据包交换过程。 2&#xff1a;掌握如何通过命令行释放和重新获取IP地址&#xff0c;并通过抓包软件分析DHCP消息的具体内容。 二&#xff1a;实验仪器设备及软件 硬…

人工智能类——计算机科学与技术

计算机科学与技术是一个非常大的门类。目前计算机科学与技术类招生的专业主要有计算机科学与技术、软件工程、网络工程、信息安全、物联网工程等&#xff0c;后面的几个专业是计算机科学与技术的重要分支&#xff0c;而这个门类的其他分支并没有单列出来一个本科专业&#xff0…

前端江湖:从菜鸟到大侠的修炼手册

在这个数字编织的梦幻世界里&#xff0c;前端&#xff0c;这个听起来就带着几分仙气与神秘感的词汇&#xff0c;实则是每一位互联网探险家手中的魔法杖。它不仅连接着代码的冰冷逻辑与用户的炽热情感&#xff0c;更在无数次的点击与滑动间&#xff0c;绘制出一幅幅绚丽多彩的交…

北京率先建设AI原生城市,力争明年推出百个优秀行业大模型产品

7月26日&#xff0c;《北京市推动“人工智能”行动计划&#xff08;2024-2025年&#xff09;》&#xff08;简称《行动计划》&#xff09;正式向社会发布&#xff0c;新京报记者在北京市发展和改革委员会举行的新闻发布会上获悉&#xff0c;北京将率先建设AI原生城市&#xff0…

凸优化笔记-基本概念

原文 文章目录 最小二乘问题 仿射affine hullaffine dimension 凸集锥集超平面和半空间单纯形整半定锥保凸性的操作透视函数 凸函数的条件1阶判定条件2阶判定条件 Epigraph 外图 m i n i m i z e f 0 ( x ) minimize\ \ \ f_0(x) minimize f0​(x) s u b j e c t t o f i ( …

序列化与反序列化的本质

1. 将对象存储到本地 假如有一个student类&#xff0c;我们定义了好几个对象&#xff0c;想要把这些对象存储下来&#xff0c;该怎么办呢 from typing import List class Student:name: strage: intphones: List[str] s1 Student("xiaoming",10,["huawei&quo…

【机器学习】Python、NumPy和向量化的基础知识以及三者结合的用法和示例

引言 在机器学习中&#xff0c;NumPy是一个非常重要的库&#xff0c;特别是在进行向量化操作时。向量化是一种优化技术&#xff0c;可以显著提高数组计算的效率&#xff0c;特别是在处理大型数据集时。NumPy提供了丰富的数组运算功能&#xff0c;使得向量化操作变得简单高效 文…

2024103读书笔记|《飞花令·柳》——梨花淡白柳深青,柳絮飞时花满城

2024103读书笔记|《飞花令柳》——梨花淡白柳深青&#xff0c;柳絮飞时花满城 《飞花令柳&#xff08;中国文化古典诗词品鉴&#xff09;》素心落雪 编著&#xff0c;飞花令得名于唐代诗人韩翃《寒食》中的名句“春城无处不飞花”&#xff0c;类似于行酒令&#xff0c;是文人们…

DVWA中命令执行漏洞细说

在攻击中&#xff0c;命令注入是比较常见的方式&#xff0c;今天我们细说在软件开发中如何避免命令执行漏洞 我们通过DVWA中不同的安全等级来细说命令执行漏洞 1、先调整DVWA的安全等级为Lower,调整等级在DVWA Security页面调整 2、在Command Injection页面输入127.0.0.1&…

基于飞腾FT2000的嵌入式计算机系统

作为中国嵌入式计算机的领导厂家&#xff0c;是最早进入轨道交通领域的 工业级AFC嵌入式计算机系列产品&#xff0c;充分体现了轨道交通新一代AFC主流新技术的各种特点&#xff0c;为轨道交通AFC系统的升级换代提供了良好的系统平台。 标准化 采用开放式架构的Intel新一代主流…

lua 游戏架构 之 游戏 AI (八)ai_tbl 行为和优先级

定义一系列的AI行为类型和它们的优先级&#xff0c;以及一个映射表ai_tbl来关联每种AI行为类型与对应的脚本文件和优先级。以下是对代码的详细解释&#xff1a; lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客https://blog.csdn.net/heyuchang666/artic…

python+vue3+onlyoffice在线文档系统实战20240726笔记,左侧菜单实现和最近文档基本实现

解决右侧高度过高的问题 解决方案&#xff1a;去掉右侧顶部和底部。 实现左侧菜单 最近文档&#xff0c;纯粹文档 我的文档&#xff0c;既包括文件夹也包括文件 共享文档&#xff0c;别人分享给我的 基本实现代码&#xff1a; 渲染效果&#xff1a; 简单优化 设置默认菜…

Keras入门:一维线性回归问题

目录 一、一维变量线性回归 1. 数据生成 2. 建立训练模型 3. 作图 4. 完整代码 一、一维变量线性回归 1. 数据生成 import keras import numpy as np import matplotlib.pyplot as plt #matplotlib inline xnp.linspace(0, 100, 30) #0~100之间&#xff0c;生成30个数 y…

Leetcode—154. 寻找旋转排序数组中的最小值 II【困难】

2024每日刷题&#xff08;147&#xff09; Leetcode—154. 寻找旋转排序数组中的最小值 II 实现代码 class Solution { public:int findMin(vector<int>& nums) {int l 0;int r nums.size() - 1;int m -1;while(l < r) {m (r - l) / 2 l;if(nums[m] < n…

Python 机器学习求解 PDE 学习项目——PINN 求解二维 Poisson 方程

本文使用 TensorFlow 1.15 环境搭建深度神经网络&#xff08;PINN&#xff09;求解二维 Poisson 方程: 模型问题 − Δ u f in Ω , u g on Γ : ∂ Ω . \begin{align} -\Delta u & f \quad & \text{in } \Omega,\\ u & g \quad & \text{on } \Gamma:\p…

必应快速收录自动提交链接到IndexNow代码

近来发现bing的搜索量也越来越大了&#xff0c;为了更好的对必应进行seo优化&#xff0c;我们可以把最新的网站文章链接提交给必应IndexNow&#xff0c;以此来加快必应快速收录网站文章链接&#xff0c;那么我们我如何使用php代码来实现提交网站文章链接到必应IndexNow呢&#…