// 0927. Three Equal Parts
class Solution {
public int[] threeEqualParts(int[] arr) {
int sum = 0;
for (int d : arr) sum += d;
if (sum == 0) return new int[]{0, 2};
int[] ans = new int[]{-1, -1};
if (sum % 3 != 0) return ans;
int oneThird = sum / 3;
int first1Part3 = arr.length;
int count1 = 0;
while (count1 != oneThird) {
--first1Part3;
count1 += arr[first1Part3];
}
int lengthPart = arr.length - first1Part3;
int first1Part1 = 0;
while (arr[first1Part1] == 0) ++first1Part1;
for (int i = 0; i < lengthPart; ++i) {
if (arr[first1Part1 + i] != arr[first1Part3 + i]) return new int[]{-1, -1};
}
ans[0] = first1Part1 + lengthPart - 1;
int first1Part2 = first1Part1 + lengthPart;
while (arr[first1Part2] == 0) ++first1Part2;
for (int i = 0; i < lengthPart; ++i) {
if (arr[first1Part2 + i] != arr[first1Part3 + i]) return new int[]{-1, -1};
}
ans[1] = first1Part2 + lengthPart;
return ans;
}
}
学习笔记:
这是一道困难题,需要把数字变成三等分。
首先我们找到最后一段,因为最后一段可以保证后面的确定性,至于前导零就不考虑了。
然后根据最后一段的情况,来找第一段,先去掉前导零,然后试试看对不对得上。
如果第一段没问题,就再去掉前导零试试看找第二段。
全部都没问题就可以把两个下标找到返回了。