1. 程式人生 > >[lintcode] 877. 同和分割陣列 [Medium]

[lintcode] 877. 同和分割陣列 [Medium]

描述

給定一個有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;
    }
};