题目
给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个非空的部分 ,使得所有这些部分表示相同的二进制值。
如果可以做到,请返回任何 [i, j],其中 i+1 < j,这样一来:
arr[0], arr[1], …, arr[i] 为第一部分; arr[i + 1], arr[i + 2], …, arr[j - 1] 为第二部分; arr[j], arr[j + 1], …, arr[arr.length - 1] 为第三部分。 这三个部分所表示的二进制值相等。 如果无法做到,就返回 [-1, -1]。
注意,在考虑每个部分所表示的二进制时,应当将其看作一个整体。例如,[1,1,0] 表示十进制中的 6,而不会是 3。此外,前导零也是被允许的,所以 [0,1,1] 和 [1,1] 表示相同的值。
示例
输入:arr = [1,0,1,0,1] 输出:[0,3]
输入:arr = [1,1,0,1,1] 输出:[-1,-1]
输入:arr = [1,1,0,0,1] 输出:[0,2]
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/three-equal-parts 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:模拟
?题解:https://leetcode.cn/problems/three-equal-parts/solution/-by-muse-77-dper/
Java实现
class Solution {
public int[] threeEqualParts(int[] arr) {
int n = arr.length;
int[] record = new int[n + 1];
int oneCount = 0;
for (int i = 0; i < n; i++) {
if (arr[i] == 1) {
oneCount++;
record[oneCount] = i;
}
}
if (oneCount == 0) return new int[]{0, n - 1};
if (oneCount % 3 != 0) return new int[]{-1, -1};
int gn = oneCount / 3, lzn = n - 1 - record[oneCount];
if (record[gn + 1] - record[gn] - 1 < lzn || record[gn * 2 + 1] - record[gn * 2] - 1 < lzn) return new int[]{-1, -1};
int tail1 = record[gn] + lzn, tail2 = record[gn * 2] + lzn, tail3 = record[gn * 3] + lzn;
int nums = Math.min(Math.min(tail1 + 1, tail2 - tail1), tail3 - tail2);
int[] res = new int[]{tail1, tail2 + 1};
while(nums-- > 0) {
if (arr[tail1] != arr[tail2] || arr[tail1]!= arr[tail3] || arr[tail2] != arr[tail3]) return new int[]{-1, -1};
tail1--;
tail2--;
tail3--;
}
return res;
}
}
|