从给定的两个数组中查找子数组,以便它们在Python中的总和相等
假设我们有两个数组P和Q,它们的大小为N,它们的个数为1到N。我们必须从给定数组中找到子数组,以使它们具有相等的总和。最后返回这些子数组的索引。如果没有解决方案,则返回-1。
因此,如果输入像P=[2、3、4、5、6],Q=[9、3、2、6、5],则输出将是第一个数组中的索引:0、1、2以及第二个数组中的索引:0,所以P[0..2]=2+3+4=9且Q[0]=9。
为了解决这个问题,我们将遵循以下步骤-
定义一个函数get_subarray()。这将需要P,Q,交换
N:=P的大小
index:=一个新映射
差:=0,j:=0
index[0]:=一对像(-1,-1)
对于0到N范围内的i,执行
如果交换是正确的,那么
除此以外,
返回
idx:=索引[Q[j]-P[i]]
显示从idx[1]+1到j的所有值
显示从idx[0]+1到i的所有值
idx:=索引[Q[j]-P[i]]
显示P的从idx[0]+1到i的所有值
显示从idx[1]+1到j的所有值
j:=j+1
当Q[j]<P[i]时,
差异:=Q[j]-P[i]
如果索引中存在差异,则
索引[差异]:=(i,j)
显示-1
从主要方面,执行以下操作-
使用它们的累计和更新P和Q
N:=P的大小
如果Q[N-1]>P[N-1],则
get_subarray(P,Q,False)
除此以外,
get_subarray(Q,P,True)
例
让我们看下面的实现以更好地理解-
def show_res(x, y, num): print("Indices of array", num, ":", end = " ") for i in range(x, y): print(i, end = ", ") print(y) def get_subarray(P, Q, swap): N = len(P) index = {} difference, j = 0, 0 index[0] = (-1, -1) for i in range(0, N): while Q[j] < P[i]: j += 1 difference = Q[j] - P[i] if difference in index: if swap: idx = index[Q[j] - P[i]] show_res(idx[1] + 1, j, 1) show_res(idx[0] + 1, i, 2) else: idx = index[Q[j] - P[i]] show_res(idx[0] + 1, i, 1) show_res(idx[1] + 1, j, 2) return index[difference] = (i, j) print(-1) def cumsum(arr): n = len(arr) for i in range(1, n): arr[i] += arr[i - 1] P = [2, 3, 4, 5, 6] Q = [9, 3, 2, 6, 5] cumsum(P) cumsum(Q) N = len(P) if Q[N - 1] > P[N - 1]: get_subarray(P, Q, False) else: get_subarray(Q, P, True)
输入项
[2, 3, 4, 5, 6],[9, 3, 2, 6, 5]
输出结果
Indices of array 1 : 0, 1, 2 Indices of array 2 : 0