【发布时间】:2021-03-17 15:58:43
【问题描述】:
和以前一样,我得到了一个字符串列表,我必须将该 ONE 列表拆分为两个列表,以检查是否可能有相等的总和。如果可能,返回数组 1 和数组 2。
以下代码适用于一组组合
例如。 myArr = [1, 2, 3, 4]
每次完整迭代都会执行以下操作 (targetSum = sum(myArr) / 2) #5
#1: PartialArr1 = [1] , PartialArr2 = [2,3,4] , 检查是否 Arr1 == targetSum
#1: PartialArr1 = [1, 2] , PartialArr2 = [3,4] , 检查是否 Arr1 == targetSum
#1: PartialArr1 = [1, 2, 3] , PartialArr2 = [4] , 检查是否 Arr1 == targetSum
#1: PartialArr1 = [1, 2, 3, 4] , PartialArr2 = [] , 检查是否 Arr1 == targetSum
虽然 #1 不返回任何 True 值,但将数字排列一次
#2: myArr = [2, 3, 4, 1]
#2: PartialArr1 = [2] , PartialArr2 = [3,4,1] , 检查是否 Arr1 == targetSum
#2: PartialArr1 = [2, 3] , PartialArr2 = [4,1] , 检查是否 Arr1 == targetSum #返回 PartialArr1, PartialArr2
def group(s):
sumOfArr = sum(s)
isPossible = sumOfArr%2
if(isPossible == 0):
#No remainder, possible to get a combination of two equal arrays
targetSum = int(sumOfArr/2)
partialArr1 = []
partialArr2 = []
i = 0
while(targetSum != sum(partialArr1)):
partialArr1.append(s[i])
partialArr2 = s[i+1:]
i+=1
if(i == len(s)-1) or (sum(partialArr1) > targetSum):
partialArr1 = []
partialArr2 = []
i = 0
s = s[1:] + s[:1]
return partialArr1,partialArr2
else:
#Not possible, return None, None
return None, None
虽然我的解决方案适用于大多数排列组,但不适用于以下情况:
#The following works with my code ->
#s = [135, 129, 141, 121, 105, 109, 105, 147]
#s = [-14, 3, 4, 13, -1, -5, 0, 5, -10, 8, -4, 10, -12, 11, 9, 12, -6, -11, -9, -8]
#s= [-1, 1, 4, 2, 8, 0]
#s = [10, 2,2,10, 2, 2, 2,10]
#SOLUTION SHOULD RETURN THE FOLLOWING
#s1 = [6, 10, 6, 10], sum(s1) = 32
#s2 = [7, -3, 1, -4, 2, 2, 7, -3, 2, 4, 0, 7, 6, -2, -4, 10], sum(s1) = 32
s = [7, -3, 6, 1, 10, -4, 2, 2, 6, 7, -3, 2, 4, 0, 7, 6, -2, 10, -4, 10]
group(s) #This does not work because it does not permutate all possible ways of len(s)^2 ways. Thus I am stucked at this point of time
任何帮助将不胜感激!谢谢!!
【问题讨论】:
-
您的 while 循环仅测试数组的一个拆分,而问题(和示例)表明您需要测试许多(如果不是全部)组合。所以解决方案将取决于上下文(这个问题是关于暴力算法的讲座的一部分,使用组合吗?关于动态编程?还是可以接受贪婪的解决方案?)
-
嗨,我使用的方法没有要求,但是我已经编辑了我的答案,请看一下,现在我被 [1,2,3, 4], [2,3,4,1], [3,4,1,2], [4,3,2,1]
标签: python