Skip to content

Commit 75707dc

Browse files
authored
Create 2035.Partition-Array-Into-Two-Arrays-to-Minimize-Sum-Difference.cpp
1 parent 61ed7e7 commit 75707dc

1 file changed

Lines changed: 58 additions & 0 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using LL = long long;
2+
class Solution {
3+
public:
4+
unordered_map<int, vector<LL>> helper(vector<int>&nums)
5+
{
6+
unordered_map<int, vector<LL>>Map;
7+
int n = nums.size();
8+
for (int state=0; state<(1<<n); state++)
9+
{
10+
LL sum = 0;
11+
int k = __builtin_popcount(state);
12+
for (int i=0; i<n; i++)
13+
{
14+
if ((state>>i)&1)
15+
sum += (LL)nums[i];
16+
}
17+
Map[k].push_back(sum);
18+
}
19+
for (auto& x: Map)
20+
sort(x.second.begin(), x.second.end());
21+
return Map;
22+
}
23+
24+
25+
int minimumDifference(vector<int>& nums)
26+
{
27+
int n = nums.size()/2;
28+
vector<int>nums1;
29+
vector<int>nums2;
30+
for (int i=0; i<n; i++)
31+
nums1.push_back(nums[i]);
32+
for (int i=n; i<2*n; i++)
33+
nums2.push_back(nums[i]);
34+
35+
unordered_map<int, vector<LL>>Map1 = helper(nums1);
36+
unordered_map<int, vector<LL>>Map2 = helper(nums2);
37+
38+
LL sum = accumulate(nums.begin(), nums.end(), 0LL);
39+
LL ret = LLONG_MAX;
40+
41+
for (int i=0; i<=n; i++)
42+
{
43+
int j = n-i;
44+
for (LL x: Map1[i])
45+
{
46+
auto iter = lower_bound(Map2[j].begin(), Map2[j].end(), sum/2-x);
47+
if (iter!=Map2[j].end())
48+
ret = min(ret, abs(*iter*2+2*x-sum));
49+
if (iter!=Map2[j].begin())
50+
{
51+
iter = prev(iter);
52+
ret = min(ret, abs(*iter*2+2*x-sum));
53+
}
54+
}
55+
}
56+
return ret;
57+
}
58+
};

0 commit comments

Comments
 (0)