文章目錄
1013. Partition Array Into Three Parts With Equal Sum
Problem Description
Given an array A of integers, return true if and only if we can partition the array into three non-empty parts with equal sums.
Formally, we can partition the array if we can find indexes i+1 < j with (A[0] + A[1] + … + A[i] == A[i+1] + A[i+2] + … + A[j-1] == A[j] + A[j-1] + … + A[A.length - 1])
Solution Method
Solution One
首先考慮的是首尾指針,但是發現條件不好判斷。於是改爲先求前綴和,之後再兩層for求任意兩個區間元素和,判斷是否有三個相等區間。在50/55時超時了。代碼如下:
bool canThreePartsEqualSum(int* A, int ASize)
{
int prefixSum[ASize];
memset (prefixSum, 0, sizeof(int) * ASize);
prefixSum[0] = A[0];
for (int i = 1; i < ASize; i ++)
{
prefixSum[i] = A[i] + prefixSum[i-1];
}
if (prefixSum[ASize-1] % 3 != 0)
return false;
for (int i = 0; i < ASize; i ++)
{
for (int j = 1; j < ASize-1; j ++)
{
if (prefixSum[i] == (prefixSum[j] - prefixSum[i]) && prefixSum[i] == (prefixSum[ASize-1]-prefixSum[j]) && i < j)
{
return true;
}
}
}
return false;
}
Solution Two
利用sum的值,可將時間複雜度改爲O(n)。代碼如下:
bool canThreePartsEqualSum(int* A, int ASize)
{
int sum = 0;
int prefixSum[ASize], subI = -1, subJ = -1;
memset(prefixSum, 0, sizeof(int) * ASize);
for (int i = 0; i < ASize; i ++)
{
sum += A[i];
}
if (sum % 3 != 0)
return false;
prefixSum[0] = A[0];
if (prefixSum[0] == sum/3)
subI = 0;
for (int i = 1; i < ASize-1; i ++)
{
prefixSum[i] = prefixSum[i-1] + A[i];
if (prefixSum[i] == sum/3 && subI == -1)
subI = i;
else if (prefixSum[i] == 2*(sum/3) && subI != i && subI != -1)
{
subJ = i;
return true;
}
}
return false;
}