最小交换次数排序17 Mar 2025 | 4 分钟阅读 在本教程中,我们将编写 Python 程序来查找排序给定列表所需的最小交换次数。我们给出了一个包含 n 个不同元素的数组,我们需要找到将数组按升序排序所需的最小交换次数。例如 - 示例 1 输入 nums = [2, 8, 5, 4] 输出 1 说明 将 8 与 4 交换。 示例 2 输入 nums = [10, 19, 6, 3, 5] 输出 2 说明 将 10 与 3 交换,将 19 与 5 交换。 让我们来实现上述问题的解决方案。 解决方案 - 让我们从视觉上理解上述问题。我们将有 n 个节点,如果第 i 个索引处的元素必须存在于排序数组的第 j 个索引处,则从节点 i 到节点 j 有一条有向边。下面是输入图。 ![]() 正如我们所见,需要两次交换才能使数组按升序排序。我们需要识别给定数组中的循环。让我们来理解下面的例子。 示例 - 输出 Minimum Swap Required: 2 解释 - 在上面的代码中,我们首先创建一个接受列表作为参数的 **minimum_swaps()** 函数。然后我们初始化 swaps 变量,它将跟踪执行的交换次数。然后我们复制数组到 **arr_copy**,以便我们可以执行交换而不更改原始数组。然后,我们对复制的数组进行排序以获得预期的输出。我们创建了一个大小为 n、值为 **False** 的 visited 数组来跟踪已访问的元素。然后我们迭代数组的每个元素并执行以下步骤 - a. 检查当前元素是否已被访问,或者它是否在其正确排序的位置(即当前索引等于元素值减一)。 如果为真,则继续下一个元素。 如果为假,则表示我们遇到了一个新的循环。初始化一个名为 cycleSize 的变量为 0,它将表示当前循环的大小。 进入循环直到我们完成循环 i. 将当前元素标记为已访问。 ii. 递增 cycleSize 变量。 iii. 更新当前元素到其正确的排序位置。 iv. 如果新元素与原始元素相同,则退出循环,因为循环已完成。 退出循环后,将 cycleSize - 1 添加到 swaps 变量。这是因为大小为 cycleSize 的循环需要 cycleSize - 1 次交换才能排序。 然后我们返回 swaps 的值。 我们可以在不创建数组副本和对其进行排序的情况下解决它。我们可以假设给定的数组包含不同的元素,并利用循环检测概念来找到所需的最小交换次数。 让我们理解下面的例子。 示例 - 输出 2 解释 - 在上面的代码中,我们实现了一个名为 **minimum_swaps()** 的函数,该函数计算将数组 arr 排序为升序所需的最小交换次数。它使用了选择排序算法的修改版本。 **minimum_swaps()** 函数接受一个数组 arr 作为输入。它初始化两个变量:n 为数组 arr 的长度,swaps 为一个计数器,用于跟踪执行的交换次数。然后我们使用一个 for 循环,该循环从 0 迭代到 n-1,代表数组中元素的索引。 在循环中,它检查当前元素 arr[i] 是否在其正确的排序位置,即 i + 1(因为数组预计包含从 1 开始的连续数字)。 如果元素不在其正确的位置,它将进入一个 while 循环,直到元素被交换到其正确的位置。 在 while 循环内部,代码执行交换操作。它将当前元素临时存储在变量 temp 中,然后通过访问 arr[temp - 1] 将当前元素与其正确位置的元素进行交换。使用 -1 是因为数组索引从 0 开始。 交换后,计数器 swaps 增加 1。 while 循环一直持续到当前元素处于正确位置,然后代码继续执行 for 循环的下一个迭代。 for 循环完成后,函数返回执行的总交换次数。 最后,我们传入一个包含元素 [4, 3, 1, 2] 的数组 arr,并使用此数组作为参数调用 minimum_swaps 函数。结果存储在 result 变量中。 最后,打印结果的值,它表示对数组进行排序所需的最小交换次数。在这种情况下,输出将是 2。 |
在本教程中,我们将学习如何在我们的 PyQt5 应用程序中添加和使用表格。表格是一种行列数据布局,常用于数据分析、研究和交流。QTableWidget 允许我们向我们的 PyQt 添加一个或多个表格...
阅读 6 分钟
简介 基于比较的排序算法快速排序使用分治策略。它根据它们是小于还是大于作为枢轴的元素,将剩余的成员分成 2 个子数组(或子列表),该枢轴是从……中选择的“枢轴”元素。
阅读 4 分钟
在 Python 中,将多个列表合并为一个列表是常见的操作。Python 提供了多种方法来完成此任务。在本教程中,我们将了解如何在 Python 中将多个列表合并为一个列表。在 Python 中将多个列表合并为一个列表 以下...
阅读 4 分钟
Python 使用 LEGB 规则来解析名称,该规则以 Python 的名称作用域命名。以下是对这些术语中每一个含义的简要解释:任何 Python 函数和 lambda 表达式的代码块和主体都属于...
阅读 3 分钟
假设您已经使用 sched 模块或 datetime 模块工作过,大多数人会同意您最终需要对时间进行一些计划。假设您已经考虑了此类元素的扩展将如何持续存在,您可能也得出了一个结论,即可以编写...
5 分钟阅读
? 在本文中,您将学习如何在 Python 中打印给定矩阵的螺旋矩阵。以下是打印给定矩阵的螺旋矩阵的 Python 实现:def spiral_matrix(matrix): # 定义变量 top, bottom = 0, len(matrix)-1 ...
阅读 6 分钟
? 二进制是基数 2 数字系统,这意味着它只使用两个数字 - 0 和 1。另一方面,十进制是基数 10 数字系统,这意味着它使用十个数字 - 0 到 9。要在 Python 中将二进制数转换为十进制,我们...
阅读 3 分钟
scikit-learn 的 linear_model 模块实现了普通最小二乘法 (OLS) 和 Ridge 回归。通过模型特征,您可以在使用 OLS 或 Ridge 回归拟合线性回归模型时获得估计的系数和方差。scikit-learn 的 LinearRegression 类可用于 OLS……
阅读 6 分钟
在本教程中,我们将编写程序来查找列表中第一个重复元素的索引。这是一个很容易在面试中问到的问题。让我们看看以下问题陈述。问题陈述 给定一个整数数组 array,其中...
阅读 2 分钟
对于评估机器学习模型的有效性,评估至关重要。一个由机器学习开发出的模型会使用各种指标进行评估。为了根据性能优化模型,选择最佳指标至关重要。我们讨论了数学基础并使用...
阅读 16 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India