查找可以在Python中将数组划分为相等总和的子数组的总和
假设我们有一个整数数组A;我们必须找到sum的所有值,以便对于sum[i]值可以将数组划分为sumsum[i]的子数组。如果我们不能将数组划分为相等和的子数组,则返回-1。
因此,如果输入类似于A=[2,4,2,2,2,2,4,2,6],则输出将为[6,8,12],因为该数组可以分为以下子数组总和6、8和12。这些如下:[{2,4},{2,2,2},{4,2},{6}][{2,4,2},{2,2,4},{2,6}][{2,4,2,2,2},{4,2,6
为了解决这个问题,我们将遵循以下步骤-
n:=一个的大小
table:=大小为n并填充0的数组
table[0]:=a[0]
对于1到n范围内的i,执行
table[i]:=a[i]+table[i-1]
S:=table[n-1]
my_map:=新映射
对于0到n范围内的i,执行
my_map[table[i]]:=1
答案:=一套新的
对于范围1到((S)的平方根)+1的整数部分的i
is_present:=真
part_1:=我
part_2:=S/i的商
对于范围从part_1到S+1的j,在每一步中由part_1更新,执行
如果is_present为true并且part_1与S不相同,则
is_present:=真
对于(S/i)到S+1的范围商的j,每步更新S//i,执行
如果is_present并且part_2与S不同,则
is_present:=错误
从循环中出来
如果j不在my_map中,则
添加答案的(part_1)
is_present:=错误;
从循环中出来
如果j不在my_map中,则
添加答案的(part_2)
如果Smodi与0相同,则
如果答案的大小等于0,则
返回-1
返回答案
示例
让我们看下面的实现以更好地理解-
from math import sqrt def find_sum(a) : n = len(a) table = [0] * n table[0] = a[0] for i in range(1, n) : table[i] = a[i] + table[i - 1] S = table[n - 1] my_map = {} for i in range(n) : my_map[table[i]] = 1 answer = set() for i in range(1, int(sqrt(S)) + 1) : if (S % i == 0) : is_present = True; part_1 = i part_2 = S // i for j in range(part_1 , S + 1, part_1) : if j not in my_map : is_present = False break if (is_present and part_1 != S) : answer.add(part_1) is_present = True for j in range(S // i , S + 1 , S // i) : if j not in my_map: is_present = False; break if (is_present and part_2 != S) : answer.add(part_2) if(len(answer) == 0) : return -1 return answer a = [2, 4, 2, 2, 2, 4, 2, 6] print(find_sum(a))
输入项
[2, 4, 2, 2, 2, 4, 2, 6]
输出结果
{8, 12, 6}