三等分

发布时间 2023-05-24 18:55:51作者: 失控D大白兔

将数组分为三个部分,每部分对应二进制数值相同

1. 三指针

各部分1的数目应当相同,借助这个性质来找三个指针的起始位置
根据最后一个指针起始位置确定串的长度,逐位比较即可

class Solution {
public:
    vector<int> threeEqualParts(vector<int>& arr) {
        int sum = accumulate(arr.begin(), arr.end(), 0);
        if (sum % 3 != 0)  return {-1, -1};//无法划分
        if (sum == 0) return {0, 2}; //任意划分

        int partial = sum / 3; //每个区域累计1的数目
        int first = 0, second = 0, third = 0, cur = 0;
        for (int i = 0; i < arr.size(); i++) { //去掉前导0
            if (arr[i] == 1) { //累计1的数目
                if (cur == 0) first = i;
                else if (cur == partial) second = i;
                else if (cur == 2 * partial) third = i;
                cur++;
            }
        }

        int len = (int)arr.size() - third;//第三个部分长度
        if (first + len <= second && second + len <= third) {//去除前导0后,前面应该有足够的余量,最后三个串长度一致
            int i = 0;
            while (third + i < arr.size()) {
                if (arr[first + i] != arr[second + i] || arr[first + i] != arr[third + i]) //同时比较对应位置
                    return {-1, -1};
                i++;
            }
            return {first + len - 1, second + len};
        }
        return {-1, -1};
    }
};