548. Split Array with Equal Sum

Given an array with n integers, you need to find if there are triplets (i, j, k) which satisfies following conditions:

  1. 0 < i, i + 1 < j, j + 1 < k < n - 1 
  2. Sum of subarrays (0, i - 1), (i + 1, j - 1), (j + 1, k - 1) and (k + 1, n - 1) should be equal. 

where we define that subarray (L, R) represents a slice of the original array starting from the element indexed L to the element indexed R.

 

Example:

Input: [1,2,1,2,1,2,1]
Output: True
Explanation:
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
class Solution {
public:
    bool splitArray(vector<int>& nums) {
        if(nums.size() < 7) return false;
        vector<int> sum(nums.size(),0);
         unordered_map<int,unordered_set<int>> mp;
        sum[0] = nums[0];
        for(int i = 1; i < sum.size(); ++i){
            sum[i] = sum[i-1] + nums[i];
        }
        for(int j = 0;j<nums.size();j++)
        {
            int total = sum[j];
            if(mp.find(j) != mp.end() && mp[j].find(total) != mp[j].end()) continue;
            if(dfs(j+1,total,sum,1,mp,nums))
                return true;
            mp[j].insert(total);
         }
        return false;
    }
private:
    bool dfs(int idx,int total,vector<int>&sum,int k,unordered_map<int,unordered_set<int>>& mp,vector<int>&nums)
    {        
        if(k == 4 && idx == nums.size()) return true;
        if(k > 4) return false;
       
        for(int i = idx+1;i<nums.size();i++)
        {
            if(sum[i] - sum[idx] == total)
            {
                 if(mp.find(i) != mp.end() && mp[i].find(total) != mp[i].end()) continue;
                if(dfs(i+1,total,sum,k+1,mp,nums))
                    return true;
                 mp[i].insert(total);
            }
        }
        return false;
    }
};

 

posted @ 2017-11-23 16:54  jxr041100  阅读(163)  评论(0编辑  收藏  举报