搜索
首页后端开发php教程按级别对二叉树进行排序的最少操作数

2471。按级别对二叉树进行排序的最少操作数

难度:中等

主题:树、广度优先搜索、二叉树

您将获得一个二叉树的根,其中具有唯一值

在一次操作中,您可以选择任意两个同一级别的节点并交换它们的值。

返回使每个级别的值按严格递增顺序排序所需的最少操作数.

节点的级别是它与根节点之间的路径上的边数。

示例1:

Minimum Number of Operations to Sort a Binary Tree by Level

  • 输入: root = [1,4,3,7,6,8,5,null,null,null,null,9,null,10]
  • 输出: 3
  • 说明:
    • 交换 4 和 3。第 2 层变为 [3,4]。
    • 交换 7 和 5。第 3 级变为 [5,6,8,7]。
    • 交换 8 和 7。第 3 级变为 [5,6,7,8]。
    • 我们使用了 3 次操作,因此返回 3。
    • 可以证明3是最少需要的运算次数。

示例2:

Minimum Number of Operations to Sort a Binary Tree by Level

  • 输入: root = [1,3,2,7,6,5,4]
  • 输出: 3
  • 说明:
    • 交换 3 和 2。第 2 层变为 [2,3]。
    • 交换 7 和 4。第 3 层变为 [4,6,5,7]。
    • 交换 6 和 5。第 3 层变为 [4,5,6,7]。
    • 我们使用了 3 次操作,因此返回 3。
    • 可以证明3是最少需要的运算次数。

示例 3:

Minimum Number of Operations to Sort a Binary Tree by Level

  • 输入: root = [1,2,3,4,5,6]
  • 输出: 0
  • 说明:每个级别都已按升序排序,因此返回 0。

约束:

  • 树中的节点数量在 [1, 105] 范围内。
  • 1 5
  • 树的所有值都是唯一

提示:

  1. 我们可以将值逐级分组并独立求解每个组。
  2. 进行 BFS 逐层对值进行分组。
  3. 找到对每个级别的数组进行排序的最小交换次数。
  4. 迭代数组时,检查当前元素,如果不在正确的索引中,则将该元素替换为应该出现的元素的索引。

解决方案:

该问题是关于以最少的操作数严格升序对二叉树的值进行逐级排序。在每次操作中,我们可以交换同一级别的两个节点的值。目标是确定实现排序顺序所需的此类操作的最少数量。

要点:

  1. 二叉树级别:二叉树的每个级别都应具有严格按升序排序的值。
  2. 唯一值:所有节点都有唯一值,由于没有重复项,因此排序更容易。
  3. 用于级别分组的 BFS:使用广度优先搜索 (BFS) 遍历树并按级别对节点进行分组。
  4. 最小交换次数:对于每个级别,我们需要找到对该级别的节点值进行排序所需的最小交换次数。
  5. 约束:树最多可以有 10^5 个节点,因此解决方案必须高效。

方法:

  1. BFS 遍历:执行 BFS 遍历树并收集每一层节点的值。
  2. 对每个级别进行排序:对于每个级别,计算按严格升序对值进行排序的最小交换次数。
  3. 循环分解:最小化交换的关键观察是,对数组进行排序可以看作是循环中交换元素。每个循环错放元素的最小交换次数是循环长度减一。
  4. 累积掉期:将每个级别的掉期相加,得到所需的掉期总数。

计划:

  1. BFS:使用 BFS 遍历树,收集每一层的节点。
  2. 对每个级别进行排序:对每个级别的值进行排序并计算最小交换次数。
  3. 计算交换:使用循环分解来找到对每个级别的节点进行排序所需的最小交换。

让我们用 PHP 实现这个解决方案:2471。按级别对二叉树进行排序的最少操作数

<?php /**
 * @param TreeNode $root
 * @return Integer
 */
function minimumOperations($root) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

/**
 * Function to calculate minimum swaps to sort an array
 *
 * @param $arr
 * @return int
 */
function minSwapsToSort($arr) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}
?>

解释:

  1. 第1步:执行BFS按级别对节点进行分组:

    • 从根开始,逐层遍历树。
    • 对于每个节点,将其值附加到级别数组中的相应级别。
  2. 第 2 步:对于每个级别,计算对值进行排序的最小交换:

    • 对每个级别的值进行排序。
    • 使用基于循环的方法来计算将当前级别转换为排序级别所需的最小交换。
  3. 循环分解:

    • 对于每个未排序的元素,跟踪其循环(即它应该去的地方)并将元素标记为已访问。
    • 对于每个周期,所需的交换次数是周期长度减一。
  4. 返回交换总数:

    • 对每个级别所需的交换量求和并返回总数。

演练示例:

示例1:

输入树:

<?php /**
 * @param TreeNode $root
 * @return Integer
 */
function minimumOperations($root) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

/**
 * Function to calculate minimum swaps to sort an array
 *
 * @param $arr
 * @return int
 */
function minSwapsToSort($arr) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}
?>

级别

  • 0级:[1]
  • 1 级:[4, 3]
  • 2 级:[7,6,8,5]
  • 3 级:[9, 10]
  1. 1 级: [4, 3]

    • 将其排序为 [3, 4],并进行 1 次交换(交换 4 和 3)。
  2. 2 级:[7,6,8,5]

    • 将其排序为 [5, 6, 7, 8],并进行 2 次交换(交换 7 和 5,交换 8 和 7)。
  3. 3 级: [9, 10]

    • 已排序,无需交换。

总交换次数 = 1(1 级)2(2 级)= 3 次交换。

输出:3

示例2:

输入树:

        1
       / \
      4   3
     / \ / \
    7  6 8  5
             \
              9
               \
                10

级别

  • 0级:[1]
  • 1 级:[3, 2]
  • 2 级:[7,6,5,4]
  1. 1 级: [3, 2]

    • 将其排序为 [2, 3],并进行 1 次交换(交换 3 和 2)。
  2. 2 级:[7,6,5,4]

    • 将其排序为 [4, 5, 6, 7],并进行 2 次交换(交换 7 和 4,交换 6 和 5)。

总交换次数 = 1(1 级)2(2 级)= 3 次交换。

输出:3

时间复杂度:

  1. BFS: O(N) 其中 N 是树中的节点数。
  2. 对每个级别进行排序:对每个级别的值进行排序需要 O(L log L),其中 L 是当前级别的节点数。在最坏的情况下,总排序复杂度为 O(N log N).
  3. 循环分解:每个级别O(L)

因此,总体时间复杂度为O(N log N),在给定约束的情况下,这已经足够高效了。

输出示例:

对于输入树:

<?php /**
 * @param TreeNode $root
 * @return Integer
 */
function minimumOperations($root) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

/**
 * Function to calculate minimum swaps to sort an array
 *
 * @param $arr
 * @return int
 */
function minSwapsToSort($arr) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}
?>

输出为 3 次交换,如示例中详述。

该解决方案通过使用 BFS 按级别对节点进行分组并循环分解来有效计算对二叉树的每个级别进行排序所需的最小交换次数,以最小化交换次数。 O(N log N) 的时间复杂度是处理最多具有 10^5 个节点的树的最佳选择。

联系链接

如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!

如果您想要更多类似的有用内容,请随时关注我:

  • 领英
  • GitHub

以上是按级别对二叉树进行排序的最少操作数的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
优化PHP代码:减少内存使用和执行时间优化PHP代码:减少内存使用和执行时间May 10, 2025 am 12:04 AM

TOOPTIMIZEPHPCODEFORDUSEMEMORYUSAGEAGEAGEAGEAGEAGEANDEXECUTITIEM,关注台词:1)USEREEREFERESCENCENCINCOPYINSTEADOFCOPYINGINATATASTRUCTURESTROUCTURESTOREDUCEMORYCONSUMPTION.2)杠杆phphppphpphp'sbuilt intimpunctionslikearray_mapforfunctionslikearray_mapforfforfforfforfasterapasterexecution.3)

PHP电子邮件:分步发送指南PHP电子邮件:分步发送指南May 09, 2025 am 12:14 AM

phpisusedforsendendemailsduetoitsignegrationwithservermailservicesand andexternalsmtpproviders,自动化notifications andMarketingCampaigns.1)设置设置yourphpenvironcormentswironmentswithaweberswithawebserverserverserverandphp,确保themailfunctionisenabled.2)useabasicscruct

如何通过PHP发送电子邮件:示例和代码如何通过PHP发送电子邮件:示例和代码May 09, 2025 am 12:13 AM

发送电子邮件的最佳方法是使用PHPMailer库。1)使用mail()函数简单但不可靠,可能导致邮件进入垃圾邮件或无法送达。2)PHPMailer提供更好的控制和可靠性,支持HTML邮件、附件和SMTP认证。3)确保正确配置SMTP设置并使用加密(如STARTTLS或SSL/TLS)以增强安全性。4)对于大量邮件,考虑使用邮件队列系统来优化性能。

高级PHP电子邮件:自定义标题和功能高级PHP电子邮件:自定义标题和功能May 09, 2025 am 12:13 AM

CustomHeadersheadersandAdvancedFeaturesInphpeMailenHanceFunctionalityAndreliability.1)CustomHeadersheadersheadersaddmetadatatatatataatafortrackingandCategorization.2)htmlemailsallowformattingandttinganditive.3)attachmentscanmentscanmentscanbesmentscanbestmentscanbesentscanbesentingslibrarieslibrarieslibrariesliblarikelikephpmailer.4)smtppapapairatienticationaltication enterticationallimpr

使用PHP和SMTP发送电子邮件的指南使用PHP和SMTP发送电子邮件的指南May 09, 2025 am 12:06 AM

使用PHP和SMTP发送邮件可以通过PHPMailer库实现。1)安装并配置PHPMailer,2)设置SMTP服务器细节,3)定义邮件内容,4)发送邮件并处理错误。使用此方法可以确保邮件的可靠性和安全性。

使用PHP发送电子邮件的最佳方法是什么?使用PHP发送电子邮件的最佳方法是什么?May 08, 2025 am 12:21 AM

ThebestapproachforsendingemailsinPHPisusingthePHPMailerlibraryduetoitsreliability,featurerichness,andeaseofuse.PHPMailersupportsSMTP,providesdetailederrorhandling,allowssendingHTMLandplaintextemails,supportsattachments,andenhancessecurity.Foroptimalu

PHP中依赖注入的最佳实践PHP中依赖注入的最佳实践May 08, 2025 am 12:21 AM

使用依赖注入(DI)的原因是它促进了代码的松耦合、可测试性和可维护性。1)使用构造函数注入依赖,2)避免使用服务定位器,3)利用依赖注入容器管理依赖,4)通过注入依赖提高测试性,5)避免过度注入依赖,6)考虑DI对性能的影响。

PHP性能调整技巧和技巧PHP性能调整技巧和技巧May 08, 2025 am 12:20 AM

phperformancetuningiscialbecapeitenhancesspeedandeffice,whatevitalforwebapplications.1)cachingwithapcureduccureducesdatabaseloadprovesrovesponsemetimes.2)优化

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。