问题描述
小M有三个整数 x,y,z,他想要让这三个数平衡。具体来说,平衡的定义是:选择任意两个数,计算它们的平均数 K,然后将第三个数通过加1或者减1的操作,调整到与 K 相等。如果平均数 K 不是整数,则不可能平衡,必须重新选择。请你帮助小M计算最少的操作次数,使三个数平衡。
测试样例
样例1:
输入:
x = 3, y = 3, z = 4
输出:1
样例2:
输入:
x = 1, y = 5, z = 9
输出:0
样例3:
输入:
x = 7, y = 7, z = 10
输出:1
解题过程
我一开始想的是先对三个数进行大小排序,然后分有无两个数相同来进行分类讨论,如果两个数相同那K必然是最大数-最小数,此时会有三种情况:
-
- 最大数-最小数为奇数,则K必然就是重复值
-
- 最大数-最小数为偶数,k=(max-min)//2,K离最大数近,即最大数-K
-
- 最大数-最小数为偶数,k=(max-min)//2,K离最小数近,即K-最小数 然后再考虑三个数不相等的情况我觉得我想的有点麻烦于是看了一下MarsCode的思路如下:
-
理解问题:我们需要找到一种方法,使得三个整数
x,y,z通过最少的操作次数达到平衡状态。平衡状态的定义是:选择任意两个数,计算它们的平均数K,然后将第三个数通过加1或者减1的操作,调整到与K相等。 -
关键点:
- 计算两个数的平均数
K必须是整数。 - 调整第三个数到
K的操作次数。
- 计算两个数的平均数
-
算法步骤:
-
- 计算平均数:首先,我们需要计算任意两个数的平均数
K。如果K不是整数,则不可能平衡,直接返回-1。
- 计算平均数:首先,我们需要计算任意两个数的平均数
-
- 计算操作次数:如果
K是整数,我们需要计算将第三个数调整到K所需的最少操作次数。
- 计算操作次数:如果
-
- 选择最优方案:我们需要尝试所有可能的组合(即选择不同的两个数计算平均数),并选择操作次数最少的方案。 具体代码如下:
-
def solution(x: int, y: int, z: int) -> int:
# 定义一个函数来计算两个数的平均数,并检查是否为整数
def is_integer_average(a, b):
avg = (a + b) / 2
return avg.is_integer()
# 定义一个函数来计算将一个数调整到目标值的操作次数
def adjust_count(num, target):
return abs(num - target)
# 初始化最小操作次数为一个较大的值
min_operations = float('inf')
# 检查所有可能的平均数组合
for a, b, c in [(x, y, z), (x, z, y), (y, z, x)]:
if is_integer_average(a, b):
k = (a + b) // 2
operations = adjust_count(c, k)
min_operations = min(min_operations, operations)
return min_operations
if __name__ == '__main__':
print(solution(x = 3, y = 3, z = 4) == 1)
print(solution(x = 1, y = 5, z = 9) == 0)
print(solution(x = 7, y = 7, z = 10) == 1)
此时第三个案例怎么都无法通过,我怎么想结果都应该是等于3后来发现是我理解错误了,实际上只要做到以下两点就好:
- 如果三个数的奇偶性相同,则不需要任何操作。
- 如果不相同,则只需要一次操作:将单独的奇数加1或减1变成偶数(或将单独的偶数变成奇数)。 正确代码如下
def solution(x: int, y: int, z: int) -> int:
parity_counts = (x % 2) + (y % 2) + (z % 2)
if parity_counts == 0 or parity_counts == 3:
return 0
else:
return 1
if __name__ == '__main__':
print(solution(x = 3, y = 3, z = 4) == 1)
print(solution(x = 1, y = 5, z = 9) == 0)
print(solution(x = 7, y = 7, z = 10) == 1)
其实题目的要求非常简单,是我想复杂了,题目那个平衡的定义误导性太强了,实际上他要做的是要K存在(即平衡奇偶性),而不是中间值变成平均值,不是让你求调整第三个数到 k的操作次数。!