描述
给定一个有n个整数的数组,需要找到满足以下条件的三胞胎(i, j, k
):0 < i, i + 1 < j, j + 1 < k < n - 1
每个子数组的和(0,i - 1), (i + 1, j - 1), (j + 1, k - 1)和(k + 1, n - 1)应该相等。我们定义子数组(L, R)表示原始数组从元素索引L到元素索引R的一部分。
样例
给定 nums = [1,2,1,2,1,2,1]
, 返回 True
解释:
i = 1, j = 3, k = 5.
sum(0, i - 1) = sum(0, 0) = 1
sum(i + 1, j - 1) = sum(2, 2) = 1
sum(j + 1, k - 1) = sum(4, 4) = 1
sum(k + 1, n - 1) = sum(6, 6) = 1
思路
看到题目首先想到的是那个NP-Complete问题,就是把一个数组中的数分成和相等的两部分。但是这道题首先是数据必须连续,其次是和相等,所以想到了搜索回溯。这道题的标签是数组,但是我觉得应该打dfs之类的_(┐「ε:)_。复杂度是O(n^2)。解法适用于任意n胞胎。
代码
class Solution {
public:
/**
* @param nums: a list of integer
* @return: return a boolean
*/
int leap=0;
bool dfs(int start, int sum, vector<int> nums, int n)
{
int curSum = 0;
if(leap == 4 || start > n-1)
{
for(int curPos = start; curPos <= n-1; ++curPos)
{
curSum += nums[curPos];
}
if(curSum == sum)
{
return true;
}
else
{
return false;
}
}
int curPos = start;
curSum = nums[curPos];
while(curSum < sum && curPos <= n-4+leap)
{
curPos+=1;
curSum += nums[curPos];
}
if(curSum == sum && curPos <= n-4+leap)
{
leap+=2;
return dfs(curPos+2, sum, nums, n);
}
else
{
return false;
}
}
bool splitArray(vector<int> &nums) {
int n = nums.size();
int sum = 0;
if(n < 7) return false;
for(int i=1; i<=n-6; ++i)
{
sum += nums[i-1];
if( dfs(i+1, sum, nums, n) )
{
return true;
}
leap = 0;
}
return false;
}
};