📅  最后修改于: 2023-12-03 15:28:27.043000             🧑  作者: Mango
在解决这个问题之前,我们需要分析一下题目意思。题目中要我们通过添加1、2或5来最小化所有数组元素相同所需的步骤。那么我们就需要找到一个数x,使得对于每个数组元素a[i],通过添加x使得所有数组元素相等的步骤最小。
我们可以找到这样一个步骤,首先我们找到数组中的最小值minA和最大值maxA,然后我们枚举从minA到maxA的每一个数x,对于每一个x,我们都计算出所有元素通过添加x后变成的结果。然后我们找出变成结果中出现最多的次数maxCount,用数组长度lenA去减去这个最多出现次数maxCount,就是我们最终需要添加的次数。
下面是代码实现示例(Python):
def minSteps(arr: List[int]) -> int:
minA = min(arr)
maxA = max(arr)
ans = float('inf')
for x in range(minA, maxA+1):
cnt = 0
for a in arr:
cnt += (a - x) // 5 + (a - x) % 5 // 2 + (a-x) % 5 % 2
ans = min(ans, cnt)
return ans
我们可以将这个方法的时间复杂度分析一下。对于每一个x,我们需要遍历整个数组,因此时间复杂度是O(n),而对于一共有maxA-minA+1个x,因此总的时间复杂度是O(n*(maxA-minA)),由于x的范围是非常小的,因此实际上总的时间复杂度是很小的。
在实际的工程中,我们还需要考虑代码的可读性和可维护性。因此我们可以将计算添加次数的逻辑封装成一个子函数,代码结构更加清晰。
下面是代码实现示例(Python):
from typing import List
def minSteps(arr: List[int]) -> int:
def countSteps(x: int) -> int:
cnt = 0
for a in arr:
cnt += (a - x) // 5 + (a - x) % 5 // 2 + (a-x) % 5 % 2
return cnt
minA = min(arr)
maxA = max(arr)
ans = float('inf')
for x in range(minA, maxA+1):
ans = min(ans, countSteps(x))
return ans
最后,我们在使用这个函数的时候要注意数组元素的范围,如果超出我们预期的范围,那么我们需要对代码做出一些修改,以避免出现错误。