不使用额外空间的合并两个排序数组2024 年 8 月 29 日 | 阅读 17 分钟 在此问题中,我们将得到两个已排序的数组。我们的任务是合并给定的两个数组。但是,限制条件是我们必须在不使用任何额外空间的情况下合并它们。因此,在排序数组后,初始元素将位于第一个数组中(根据第一个数组的初始容量),其余元素位于第二个数组中。 让我们看一些例子来理解程序的输入和输出。 示例 输入: array1 = [11], array2 = [3, 4] 输出: array1 = [2], array2 = [4, 11] 输入: array1 = [1, 6, 9, 11, 16, 21], array2 = [1, 4, 7, 13] 输出: array1 = [1, 1, 4, 6, 7, 9], array2 = [11, 13, 16, 21] 如果我们允许使用额外空间,这个问题将会很简单。然而,在没有额外空间的情况下解决这个问题会使问题变得复杂。 蛮力方法将以 O(m * n) 的时间复杂度解决此问题。但是,有更有效的方法来解决它。 方法 - 1我们将采用此方法来解决此问题 我们将从第二个数组 array2 的最后一个元素开始迭代,并搜索它是否存在于 array1 中。如果我们发现 array1 中有一个元素大于该元素,我们将把最后一个元素移动到第一个数组 array1,而将另一个元素移动到 array2。为了保持两个数组的排序,我们必须将元素插入到正确的位置。我们可以使用插入排序算法来搜索这个正确的位置。 以下是解决此问题的算法方法
以下是实现上述方法的 Python 程序。 代码 输出 Initial First Array: 1 6 9 11 16 21 Initial Second array: 1 4 7 13 Merged First Array: 1 1 4 6 7 9 Merged First Array: 11 13 16 21 时间复杂度:该程序需要 O(M * N) 来完成。时间复杂度是非线性的,因为我们在嵌套循环中迭代两个数组。 辅助空间:由于问题本身要求只使用常数额外空间来解决。因此,空间复杂度为 O(1)。 方法 - 2现在我们将讨论另一种解决此问题的有效方法。 上述解决方案中存在一个重复的模式。当同时遍历两个已排序数组时,假设我们到达第二个已排序数组的第 j 个元素,它小于第一个已排序数组的第 i 个元素。那么在下一步,我们必须将第 j 个元素插入到第一个数组中,从第一个数组中移除某个第 k 个元素并将其插入到第二个数组中。我们将使用此模式来优化上述代码。 以下是我们为解决此问题将遵循的步骤
以下是上述算法的 Python 程序 代码 输出 Initial First Array: 1 6 9 11 16 21 Initial Second array: 2 4 7 13 Merged First Array: 1 2 4 6 7 9 Merged Second Array: 11 13 16 21 时间复杂度:该程序需要 O((N + M) * log(N + M)) 来完成。这里 N 和 M 是两个数组的大小。我们只遍历列表一次 (N + M);但是,我们在每次迭代结束时对数组进行排序;因此,线性时间乘以 log(N + M)。 空间复杂度:由于程序不使用任何额外空间,因此为 O(1)。 方法 - 3我们将使用此方法解决此问题 此方法将比较第一个数组的最后一个元素与第二个数组的第一个元素。现在,如果第一个数组的元素大于第二个数组的元素,我们将交换这两个元素。下一步是排序数组。第一个数组已经排序,但我们有第二个数组。我们必须重复这些步骤,直到第一个条件为真。在过程结束时,我们将得到两个已排序的数组。 我们将为这种方法遵循以下步骤。
以下是使用上述方法的 Python 程序,用于解决此问题。 代码 输出 Initial First Array: 1 6 9 11 16 21 Initial Second array: 1 4 7 13 Merged First Array: 1 1 4 6 7 9 Merged First Array: 11 13 16 21 时间复杂度:该程序的时间复杂度为 O(M * (N * logN))。这里 M 和 N 是两个数组的大小。LogN 的时间复杂度是在每次迭代结束时对第二个数组进行排序。 辅助空间:空间复杂度与 O(1) 相同。 方法 - 4以下是解决此问题的另一种方法。
以下是实现上述方法的 Python 代码。 代码 输出 Initial First Array: 1 6 9 11 16 21 Initial Second array: 1 4 7 13 Merged First Array: 1 1 4 6 7 9 Merged First Array: 11 13 16 21 时间复杂度:该程序需要 O(max(M * logM, N * logN)) 来完成。这里 log 的时间复杂度是在每次迭代后对两个数组进行排序。 空间复杂度:该程序将占用恒定的额外空间。因此,为 O(1) 方法 - 5在此方法中,我们将使用插入排序合并两个已排序的数组。 在上述程序中,当我们向其他数组插入元素时,我们可以使用插入排序来插入元素,因为其余数组已经排序。这将进一步降低程序的时空复杂度。因此,在交换两个元素时,我们必须将交换的元素放置在适当的位置,以便数组仍然是排序的。这可以通过单次遍历来完成。 以下是我们为解决此问题将遵循的步骤
以下是使用上述方法解决此问题的 Python 程序。 代码 输出 Initial First Array: [1, 6, 9, 11, 16, 21] Initial Second array: [1, 4, 7, 13] Merged First Array: [1, 1, 4, 6, 7, 9] Merged First Array: [11, 13, 16, 21] 时间复杂度:该程序具有非线性时间复杂度。时间复杂度为 O(M * N)。这里,M 和 N 是两个给定数组的长度。 空间复杂度:空间复杂度是所需的常数空间复杂度。因此,为 O(1)。 方法 - 6在此方法中,我们将使用欧几里得除法引理来合并两个数组。该引理陈述为 (((Operation_on_array) % A) * A) 以下是我们为解决此问题需要遵循的步骤
以下是使用欧几里得除法引理解决此问题的 Python 程序。 代码 输出 Initial First Array: 1 6 9 11 16 21 Initial Second array: 1 4 7 13 Merged First Array: 1 1 4 6 7 9 Merged First Array: 11 13 16 21 时间复杂度:由于我们使用线性循环,该程序的时空复杂度为 O(M + N) 空间复杂度: O(1) 下一主题Python 中的二项分布 |
Python 是一种编程语言,为程序员轻松执行任何活动提供了多种用途。Python 也可以用于游戏开发。在以下教程中,让我们不使用任何外部游戏库(如 PyGame)来构建一个简单的 FLAMES 游戏。但在我们开始之前...
阅读 6 分钟
re.sub() 是 Python re(正则表达式)模块中的一个函数。它用于将字符串中所有出现的模式替换为新字符串。该函数接受三个参数:pattern:要在输入字符串中搜索的正则表达式模式。repl:...
阅读 2 分钟
梯度下降使用迭代算法来寻找模型的最优参数。其主要目标是通过找到函数参数的值来最小化给定函数。这些被称为最优参数。我们可以对一个函数使用梯度下降...
阅读9分钟
这可能听起来很有趣,但无限是一个指代模棱两可的数字的概念,它可以是负值也可以是正值。每个算术运算,例如减法、除法或任何其他——都是在无限或无限值上进行的,结果总是无限的...
阅读 3 分钟
在本教程中,我们将学习如何使用 Python 程序获取国家信息。我们将讨论一个 Python 模块,以获取有关首都、货币、官方语言和许多其他信息。我们还将学习如何从电话号码中获取国家信息...
5 分钟阅读
在本教程中,我们将通过几种方式学习如何在 Python 中验证 IP 地址。当我们在编写操作系统级别的程序时,它很有用。如果我们正在使用 Django 或 Flask 开发一些 Web 应用程序,我们可能需要确定用户的 IP...
7 分钟阅读
在下一个教程中,我们将讨论一个名为 LanguageTool 的 Python 包,并了解如何使用 Python 编程语言创建一个简单的语法和拼写检查器。那么,让我们开始吧。了解 Python 中的 LanguageTool 库 LanguageTool 是一个用于语法和拼写检查的开源工具,...
7 分钟阅读
欧几里得距离是欧几里得空间中的距离;这两个概念以古希腊数学家欧几里得命名,他的《几何原本》在很长一段时间内成为计算的标准教科书。长度和距离的概念在不同文化中普遍存在,可以追溯到...
阅读 8 分钟
简介:花卉一直是人类着迷和灵感的源泉。自然世界的美丽和多样性在艺术、文学和科学中被庆祝了几个世纪。随着机器学习和计算机视觉的进步,我们现在可以...
阅读 8 分钟
Python 编程语言如今因其用户友好的功能而处于领先地位。Python 还有许多有趣的模块和库,用户可以使用它们做很多事情。Python 语言最有趣的功能之一是其音频模块。
阅读 10 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India