【发布时间】:2021-05-24 08:38:40
【问题描述】:
我有一个大小为 N 的数组 A。所有元素都是正整数。在一个步骤中,我可以添加两个相邻元素并用它们的总和替换它们。也就是说,数组大小减少了 1。现在我需要通过执行最少的步骤使所有元素相同。
例如:A = [1,2,3,2,1,3]。
第 1 步:合并索引 0 和 1 ==> A = [3,3,2,1,3]
第 2 步:合并索引 2 和 3(新数组的)==> [3,3,3,3]
因此步数为 2。
我想不出一个直接的解决方案,所以尝试了一种递归方法,通过一个一个地合并所有索引并返回当数组大小为 1 或所有元素相等时我可以获得的最小级别。
下面是我试过的代码:
# Checks if all the elements are same or not
def check(A):
if len(set(A)) == 1:
return True
return False
# Recursive function to find min steps
def min_steps(N,A,level):
# If all are equal return the level
if N == 1 or check(A):
return level
# Initialize min variable
mn = float('+inf')
# Try merging all one by one and recur
for i in range(N-1):
temp = A[:]
temp[i]+=temp[i+1]
temp.pop(i+1)
mn = min(mn, min_steps(N-1,temp, level+1))
return mn
此解决方案的复杂度为 O(N^N)。我想将它减少到接近 O(N^2) 或 O(N^3) 的多项式时间。谁能帮我修改这个解决方案或告诉我是否遗漏了什么?
【问题讨论】:
-
所有元素都是严格正数吗?
-
@user202729 是的,他们都是积极的。
-
和积分? ...
-
@user202729 所有元素都是正整数。 N的值最高可达1000。
-
@ggorlen 是的,我们可以进行多次合并。并且最多可以有 N-1 次合并,因为在该数组之后将剩下 1 个元素满足条件。
标签: arrays python-3.x recursion dynamic-programming backtracking