假设我们有一个整数数组A,当且仅当我们可以将该数组划分为三个总和相等的非空部分时,输出才为true。
形式上,如果我们可以找到索引i + 1 <j,则可以对数组进行分区,其中(A [0] + A [1] + ... + A [i]与A [i + 1] + A [ i + 2] + ... + A [j-1]和A [j] + A [j-1] + ... + A [A.length-1])
因此,如果输入为[0,2,1,-6,6,-7,9,1,2,0,1],则输出为true。三个数组将是[0,2,1],[-6,6,-7,9,1]和[2,0,1]
为了解决这个问题,我们将遵循以下步骤-
temp:=所有元素的总和,required_sum:= temp / 3
设置sum_left来存储从左到右的累计和
设置sum_right来存储从右到左的累计和
index1:= 0和index2:=数组长度– 1
而index1 <index2:
index2:= index2 – 1
index1:= index1 + 1
而index1 <index2和sum_left [index1]!= required_sum
而index2> index1和sum_right [index2]!= required_sum
如果index1 <index2并且index1!= index2,则返回true,否则返回false
让我们看下面的实现以更好地理解-
class Solution(object): def canThreePartsEqualSum(self, A): temp = sum(A) if (temp%3 != 0): return 0 sum_left=[0 for i in range(len(A))] sum_left[0] = A[0] sum_right=[0 for i in range(len(A))] sum_right[-1] = A[-1] for i in range(1,len(A)): sum_left[i] = A[i]+sum_left[i-1] for i in range(len(A)-2,-1,-1): sum_right[i] = A[i]+sum_right[i+1] #print(sum_left,sum_right) required_sum = temp/3 index1 = 0 index2 = len(A)-1 while index1 < index2: while index1 <index2 and sum_left[index1]!=required_sum: index1+=1 while index2>index1 and sum_right[index2]!=required_sum: index2-=1 return index1<index2 and index1 != index2 ob1 = Solution()print(ob1.canThreePartsEqualSum([0,2,2,-6,6,-7,9,2,2,0,2]))
[0,2,1,-6,6,-7,9,1,2,0,1]
输出结果
true