一、题目描述
二、题解
方法一:枚举
题意化简:求 A 的总和可以被分成 3 个相等的部分。
- 首先排除第一种情况:total 不能被 3 整除。
- 然后才能考虑第二种情况:可以被 3 整除,继续判断这个数组能否用 3 个子数组组成 这个值。
public boolean canThreePartsEqualSum(int[] A) {
int total = 0;
for (int i : A) total += i;
if (total % 3 != 0)
return false;
int sum = total / 3;
int t = 0, cnt = 0;
for (int a : A) {
t += a;
if (t == sum) {
cnt++;
t = 0;
}
}
return cnt >= 3;
}
在 sum % 3 == 0 的前提下,不可能出现 cnt > 3 而 的情况,除非 total = 0
复杂度分析
- 时间复杂度: ,
- 空间复杂度: ,
方法二:优化
如果在倒数第 1 个元素之前就能找到两个和为 sub 的子数组,直接返回 true。
public boolean canThreePartsEqualSum(int[] A) {
int total = 0;
for (int a : A) total += a;
if (total % 3 != 0) return false;
int sub = total / 3;
int cnt = 0, cur = 0;
for (int i = 0; i < A.length - 1; i++) {
cur += A[i];
if (cur == sub) {
cnt++;
if (cnt == 2)
return true;
cur = 0;
}
}
return false;
}
复杂度分析
- 时间复杂度: ,最差为 O(n)
- 空间复杂度: ,