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:
- 0 < i, i + 1 < j, j + 1 < k < n - 1
- 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; } };