颜色排序问题2024 年 08 月 29 日 | 阅读 9 分钟 在排序颜色问题中,我们给出一个包含三种数字的数组。假设这些数字是 0、1 和 2。我们的任务是编写一个程序来对这些数字进行排序。排序后,数组将首先包含所有 0,然后是 1,最后是 2。让我们通过一些示例来理解这个问题。 输入 [0, 1, 0, 0, 1, 2, 0, 1, 1, 2] 输出 [0, 0, 0, 0, 1, 1, 1, 1, 2, 2] 输入 [0, 1, 0, 2, 1, 2, 1, 1, 0, 1, 1, 2, 0, 0, 1, 0, 1] 输出 [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2] 暴力破解法最直接的方法是使用任何排序算法来排序数组。一个好的排序算法的平均时间复杂度为 log n,其中 n 是给定数组的大小。然而,我们可以将时间复杂度优化到线性时间复杂度。 方法 - 1我们将使用两个指针来解决这个问题。 数组可以分为四个区域,用于存储三种颜色 0、1 和 2。我们将初始化三个指针 l = 0,m = 0,h = 数组的最后一个索引。
我们将根据 i 元素执行三个操作。
让我们看一个例子来理解这个程序将如何工作。 array = [1, 0, 1, 2, 0, 1, 1] l = 0, m = 0, h = 6 步骤 - 1 array[m] == 1 m = m + 1 = 1 array = [1, 0, 1, 2, 0, 1, 1] 步骤 - 2 array[m] = 0 swap(array[l], array[m]) m = m + 1 = 2 l = l + 1 = 1 array = [0, 1, 1, 2, 0, 1, 1] 步骤 - 3 array[m] == 1 m = m + 1 = 3 array = [0, 1, 1, 2, 0, 1, 1] 步骤 - 4 array[m] == 2 swap(array[m], array[h]) h = h - 1 = 5 array = [0, 1, 1, 0, 1, 1, 2] 步骤 - 5 array[m] == 0 swap(array[l], array[m]) m = m + 1 = 4 l = l + 1 = 2 array = [0, 0, 1, 1, 2, 2] 步骤 - 6 array[m] == 2 swap(array[m], array[h]) h = h - 1 = 4 array = [0, 0, 1, 1, 2, 2] 步骤 - 7 array[m] == 2 swap(array[m], array[h]) h = h - 1 = 3 array = [0, 0, 1, 1, 2, 2] 因此,排序后的数组为 array = [0, 0, 1, 1, 2, 2]。 以下是解决此问题需要遵循的步骤。
代码输出 The sorted array is: 0 0 0 0 0 0 1 1 1 1 1 1 1 1 2 2 2 时间复杂度: 由于我们使用了线性循环,因此该方法的时间复杂度为 O(n)。 空间复杂度: 由于我们修改了原始数组,因此该方法空间复杂度为常数,即 O(1)。 方法 - 2在此方法中,我们将使用计数方法对数组进行排序。
让我们看一个例子来理解解决方案。 array = [0, 1, 0, 1, 2, 0, 1, 1, 2] count0 = 0, count1 = 0, count2 = 0 在 n = 0 时:array[0] == 0 count0 += 1 # count0 = 1 在 n = 1 时:array[1] == 1 count1 += 1 # count1 = 1 在 n = 2 时:array[2] == 0 count0 += 1 # count0 = 2 在 n = 3 时:array[3] == 1 count1 += 1 # count1 = 2 在 n = 4 时:array[4] == 2 count2 += 1 # count2 = 1 在 n = 5 时:array[5] == 0 count0 += 1 # count0 = 3 在 n = 6 时:array[6] == 1 count1 += 1 # count1 = 3 在 n = 7 时:array[7] == 1 count1 += 1 # count1 = 4 在 n = 8 时:array[8] == 2 count2 += 1 # count2 = 2 # 创建一个包含 count0 个 0,count1 个 1 和 count2 个 2 的数组。 因此,排序后的数组为 [0, 0, 0, 1, 1, 1, 1, 2, 2]。 我们将遵循以下步骤来解决上述方法的问题。
以下是上述方法的 Python 程序。 代码 输出 The sorted array is: 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 时间复杂度: 此程序中没有使用嵌套循环。仅使用了线性循环。因此,时间复杂度也是线性的,即 O(N)。 空间复杂度: 我们创建了一个数组来存储排序后的数组。因此,空间复杂度是线性的,即 O(N)。 方法 - 3我们可以修改上述方法,并将空间复杂度降低到常数。 在找到 0、1 和 2 的计数后,我们将执行以下步骤,而不是创建一个新数组。
array = [0, 0, 0, 1, 2, 0, 1, 1, 2]
array = [0, 0, 0, 1, 1, 1, 1, 1, 2]
array = [0, 0, 0, 1, 1, 1, 1, 2, 2] 因此,排序后的数组为 [0, 0, 0, 1, 1, 1, 1, 2, 2]。 因此,算法的最后一步将是运行三个 while 循环,其中迭代次数等于相应计数值,并将 0、1 和 2 存储在原始数组中。 以下是上述算法的 Python 程序。 代码 输出 The sorted array is: 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 时间复杂度 - 与之前相同,O(N)。 空间复杂度: 我们更新了给定的数组;因此,我们没有使用任何额外的空间来存储排序后的数组。因此,空间复杂度为常数,即 O(1)。 下一主题Python 中的跳跃游戏问题 |
Python 是一种动态类型语言,这意味着我们无需在使用变量之前提及变量类型或声明。这使得 Python 成为最有效和易于使用的语言。Python 中的每个变量都被视为一个对象。在声明变量之前,我们必须...
阅读 2 分钟
? 二进制是基数 2 数字系统,这意味着它只使用两个数字 - 0 和 1。另一方面,十进制是基数 10 数字系统,这意味着它使用十个数字 - 0 到 9。要在 Python 中将二进制数转换为十进制,我们...
阅读 3 分钟
简介:在生物信息学和计算生物学不断发展的领域中,研究人员经常发现自己要处理各种复杂的数据集。Bioconductor 是一个广泛使用的开源软件项目,提供了一套工具和库,以方便高通量基因组数据的分析和解释。虽然...
阅读 4 分钟
简介 信号的功率谱密度 (PSD) 描绘了其功率如何在频率上分布。它在许多技术领域都有信号处理应用。PSD 用于评估无线电和雷达等通信系统中的信道占用率和相关频率。PSD 广泛用于……
阅读 4 分钟
在软件开发人员、工程师和数据科学家中,Python 是一种备受欢迎的编程语言。其广泛的库和模块集合使得处理数据、图形和用户界面变得简单。PyQtGraph 就是一个广受欢迎的用于开发交互式实时视觉效果和可视化内容的包。您将学习...
阅读 3 分钟
构建一个组织目录中文件的 Python 程序的通用过程如下: 1. 识别目录 - 您必须找到要组织的源目录。请务必注意该目录中包含的文件。这些文件可以是...
7 分钟阅读
滑动拼图是一种流行的益智游戏,涉及在棋盘上滑动图块以将它们重新排列成特定的顺序。Python 中的滑动拼图 滑动拼图游戏也称为滑动拼图或滑动块游戏。在本文中,我们将构建一个...
7 分钟阅读
在本教程中,我们将讨论如何获取两个列表的交集。两个列表的交集意味着我们需要获取两个初始列表中所有共同的元素。Python 以其出色的内置数据结构而闻名。Python 列表...
阅读 3 分钟
假设您已经使用 sched 模块或 datetime 模块工作过,大多数人会同意您最终需要对时间进行一些计划。假设您已经考虑了此类元素的扩展将如何持续存在,您可能也得出了一个结论,即可以编写...
5 分钟阅读
主成分分析 (PCA):是一种代数技术,用于将一组可能相关的变量观测值转换为一组线性不相关变量的值。所有主成分都旨在描述变量中可用的大部分方差,并且所有主成分都是...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India