题目链接
https://leetcode.com/problems/three-equal-parts/
题意
给一个仅包含0和1的数组A(3<= A.length <= 30000),将数组分为三块,要求分为三块后的各自块二进制数保证相等,并给出如何分为三块的两个分割点,数组构成数字时可以接受前导0。
举例: [1, 1, 0] 代表 6
题目类型
智力
题目分析
挺有意思的题目。
- 首先不难想到如果要能分为三块那三个块中的1的个数必须相同,否则不可能分出三个相等的块来(同时特判一下数组全是0的情况);
- 然后再将含有1的部分等分为三块以后,如何划分数组剩下的0是问题所在。因为三个块的值都相同,所以我们可以从数组最右边的连续0的个数判断三个块形成的相同的数字的后缀0的个数,这样就能够圈定出每个块的范围了。
- 最后还要判断一下三个块去除前导0后能不能保证相等,如果能保证相等就是所求答案;如果不能保证也一定不会有解了
举个例子,寻找 [1, 0, 0, 1, 0, 1, 0] 的分块方案
首先找到三个1的位置,由最后一个块最后只有1个0将数组分为[1, 0]、[0, 1, 0]、[1, 0]
验证后发现相等,问题得解
时间复杂度
$O(N)$
源代码
代码写的非常凌乱
1 | class Solution { |