平衡三个数| 豆包MarsCode AI刷题

31 阅读3分钟

小M有三个整数 x,y,z,他想要让这三个数平衡。具体来说,平衡的定义是:选择任意两个数,计算它们的平均数 K,然后将第三个数通过加1或者减1的操作,调整到与 K 相等。如果平均数 K 不是整数,则不可能平衡,必须重新选择。请你帮助小M计算最少的操作次数,使三个数平衡。

  1. 生成所有可能的数的组合情况

    • 首先创建一个列表 combos,用于存储三个数 xyz 的所有可能的排列组合情况。通过手动列举出这六种组合,即 (x, y, z)(x, z, y)(y, x, z)(y, z, x)(z, x, y)(z, y, x),将它们放入 combos 列表中。这样做的目的是后续要考虑每一种选择两个数求平均数,然后调整第三个数的情况,需要遍历所有可能的选择方式。
  2. 初始化最少操作次数变量

    • 初始化变量 min_operations 为正无穷大(float('inf')),用于记录在所有可能的组合和调整方式中,使三个数达到平衡所需的最少操作次数。初始化为正无穷大是为了方便后续比较,能保证第一次比较时任何有效的操作次数都会小于它,从而可以正确地更新这个变量找到最小值。
  3. 遍历所有组合情况并计算操作次数

    • 通过一个循环遍历 combos 列表中的每一种组合情况 combo,对于每一种组合,将其解包为三个数 abc(例如 a, b, c = combo),这里假设 a 和 b 是用于求平均数的两个数,c 是要调整的第三个数。
    • 计算 a 和 b 的平均数 avg(通过 (a + b) / 2 计算),然后判断这个平均数是否为整数(通过 avg.is_integer() 判断),如果是整数,说明可以按照平衡的规则进行操作,接着计算第三个数 c 与平均数 avg 的差值的绝对值 diff(通过 abs(int(avg) - c) 计算,先将平均数转换为整数类型再求差值的绝对值),这个差值就是将第三个数调整到平均数所需的操作次数(每次操作可以加 1 或者减 1),将这个操作次数赋值给变量 operations
    • 将当前计算得到的操作次数 operations 与当前记录的最少操作次数 min_operations 进行比较,使用 min 函数取两者中的较小值来更新 min_operations,这样不断遍历所有组合情况并比较更新,就能找到所有可能方式中最少的操作次数。
  4. 返回最终结果

    • 当循环遍历完所有组合情况后,如果 min_operations 依然是正无穷大,说明在所有尝试的组合中,都无法找到满足条件(平均数为整数)的情况,此时返回 -1,表示无法使三个数平衡;如果 min_operations 不是正无穷大,说明找到了可以使三个数平衡的方式,将 min_operations 返回,它就是使三个数平衡所需的最少操作次数。

时间复杂度方面,生成所有组合情况的列表 combos 是常数级别的操作,循环遍历 combos 列表的时间复杂度为 ,因为 combos 列表中始终只有 6 种组合情况,在循环中进行的操作主要是简单的算术运算、判断和比较操作,时间复杂度也都是常数级别,所以整体时间复杂度为 ,在处理给定的三个整数输入时能够快速地判断并计算出最少操作次数(如果能实现平衡的话)。