这非常简单,因为您只问了最少操作数是多少。由于您不需要通用算法来实际计算沿途的步骤,因此如果您只需检查操作的每个步骤发生的情况,您可以在 O(n) 时间内轻松完成此操作。
首先,注意所有元素的总和在您对其执行操作时如何变化。让我们从简单的案例开始,然后再转向更复杂的案例。
假设我们有一个大小为 1 的数组 [1],并且我们对单个元素执行操作。它变为 [0]。所以每次操作后数组的总和增加-1。
现在假设我们有一个大小为 2 的数组 [1, 1] 并且我们针对两个元素中的任何一个执行操作。它将变为 [2, 0] 或 [0, 2]。所以每次操作数组的总和都会增加0。
对于大小为 3 的数组呢? [1, 1, 1] 在执行以第一个元素为目标的操作后变为 [0, 2, 2]。
也许您可以在这里看到公式,它是数组总和如何变化的概括,它取决于单个变量,即数组的长度!
对于任何给定的数组 A,计算总和变化的公式是:
delta_sum = len(A) - 2
那么我们如何处理这个增量总和?好吧,如果对您的示例给予足够的关注,您会注意到您得到的数字 5 不仅仅是随机巧合! [4, 5, 3] 的和是 12,[3, 2, 2] 的和是 7。这两个和之间的差是 5。如果你还记得,delta_sum 对于长度为 3 的数组总是将是+1。那么如果我们只是这样做呢? (python示例)
def minOperations(A, B):
return (sum(B) - sum(A)) / (len(A) - 2)
令人惊讶的是,这个简单的单行语句为我们提供了 大多数 数组 A 和 B 的正确答案,len(A) == len(B) 甚至像 A=[] 和 B=[] 这样的空数组也会返回 0来自这个函数,因为 0/-2 是 0。
但是等等……我们的代码有一些问题!我们将一个数字除以len(A) - 2。如果len(A) - 2 == 0 怎么办?不幸的是,如果我们的delta_sum 为 0,我们将收到 ZeroDivisionError!我们如何解决这个问题?我们可以通过简单地为长度为 2 的数组添加一个特殊情况来修复它。
我们真正想做的是:
- 如果两个数组完全相同,则返回 0。
- 如果两个数组的 sum 相同但元素不同,则返回
(B[0] - A[0]) 的绝对值。
- 否则返回
None 或一些错误,因为无法解决。例如[1, 1] -> [2, 2] 如 cmets 中所述
我们几乎完成的代码结果如下:
def minOperations(A, B):
if len(A) == 2:
if A == B:
return 0
elif sum(A) == sum(B):
return abs(B[0] - A[0])
else:
return None
return (sum(B) - sum(A)) / (len(A) - 2)
不幸的是,我们仍然需要处理一些愚蠢的问题来完善我们的代码。
其中一个问题是您有两个数组 A 和 B,完全不可能通过递减操作将 A 转换为 B。
例如考虑 A = [-1] 和 B = [1] 的情况。仅使用您在问题中描述的递减运算符,就不可能将 A 转换为 B!我们的函数会巧妙地返回'-2。在这种情况下,如果我们返回 negative 数量的操作(这很可能在概念上和实际上都是不可能的),我们可能希望返回 None 或一些异常/错误。我们可以通过以下代码做到这一点。
result = (sum(B) - sum(A)) / (len(A) - 2)
return result if result >= 0 else None
然后我们有另一个问题...如果数组 A = [1,2,3,4] 和数组 B = [1,2,3,5] 怎么办?由于我们的 delta_sum 为 2 并且总和的差为 1,我们将返回 1 / 2 整数除法,在 Python 中为 0...所以我们还需要检查我们的结果是否等价于整数,如果不是,我们是返回无效的答案。我们可以通过以下方式做到这一点:
result = float((sum(B) - sum(A))) / (len(A) - 2)
return int(result) if result >= 0 and result == int(result) else None
为了使您的代码更加健壮,您还可以添加一个断言检查,以确保两个数组的长度在代码开头是相等的。
assert(len(A) == len(B))
我们完成的代码将如下所示:
def minOperations(A, B):
assert(len(A) == len(B))
if len(A) == 2:
if A == B:
return 0
elif sum(A) == sum(B):
return abs(B[0] - A[0])
else:
return None
result = float((sum(B) - sum(A))) / (len(A) - 2)
return int(result) if result >= 0 and result == int(result) else None