小M有三个整数 x,y,z,他想要让这三个数平衡。具体来说,平衡的定义是:选择任意两个数,计算它们的平均数 K,然后将第三个数通过加1或者减1的操作,调整到与 K 相等。如果平均数 K 不是整数,则不可能平衡,必须重新选择。请你帮助小M计算最少的操作次数,使三个数平衡。
-
生成所有可能的数的组合情况:
- 首先创建一个列表
combos,用于存储三个数x、y、z的所有可能的排列组合情况。通过手动列举出这六种组合,即(x, y, z)、(x, z, y)、(y, x, z)、(y, z, x)、(z, x, y)、(z, y, x),将它们放入combos列表中。这样做的目的是后续要考虑每一种选择两个数求平均数,然后调整第三个数的情况,需要遍历所有可能的选择方式。
- 首先创建一个列表
-
初始化最少操作次数变量:
- 初始化变量
min_operations为正无穷大(float('inf')),用于记录在所有可能的组合和调整方式中,使三个数达到平衡所需的最少操作次数。初始化为正无穷大是为了方便后续比较,能保证第一次比较时任何有效的操作次数都会小于它,从而可以正确地更新这个变量找到最小值。
- 初始化变量
-
遍历所有组合情况并计算操作次数:
- 通过一个循环遍历
combos列表中的每一种组合情况combo,对于每一种组合,将其解包为三个数a、b、c(例如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,这样不断遍历所有组合情况并比较更新,就能找到所有可能方式中最少的操作次数。
- 通过一个循环遍历
-
返回最终结果:
-
当循环遍历完所有组合情况后,如果
min_operations依然是正无穷大,说明在所有尝试的组合中,都无法找到满足条件(平均数为整数)的情况,此时返回-1,表示无法使三个数平衡;如果min_operations不是正无穷大,说明找到了可以使三个数平衡的方式,将min_operations返回,它就是使三个数平衡所需的最少操作次数。
-
时间复杂度方面,生成所有组合情况的列表 combos 是常数级别的操作,循环遍历 combos 列表的时间复杂度为 ,因为 combos 列表中始终只有 6 种组合情况,在循环中进行的操作主要是简单的算术运算、判断和比较操作,时间复杂度也都是常数级别,所以整体时间复杂度为 ,在处理给定的三个整数输入时能够快速地判断并计算出最少操作次数(如果能实现平衡的话)。