-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
1982.Find-Array-Given-Subset-Sums_v2.cpp
98 lines (86 loc) · 2.42 KB
/
1982.Find-Array-Given-Subset-Sums_v2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
class Solution {
public:
vector<int> recoverArray(int n, vector<int>& sums)
{
vector<int>rets;
if (dfs(sums, n, rets))
return rets;
return {};
}
vector<int>split1(vector<int>&sums, int x)
{
int k = sums.size();
vector<int>visited(k);
vector<int>rets;
int i = k-1, j = k-1;
for (int t=0; t<k/2; t++)
{
while (i>=0 && visited[i])
i--;
if (i<0) return {};
visited[i] = 1;
while (j>=0 && (visited[j]||sums[j]!=sums[i]-x))
j--;
if (j<0) return {};
visited[j] = 1;
rets.push_back(sums[j]);
}
return rets;
}
vector<int>split2(vector<int>&sums, int x)
{
int k = sums.size();
vector<int>visited(k);
vector<int>rets;
int i = 0, j = 0;
for (int t=0; t<k/2; t++)
{
while (i<k && visited[i])
i++;
if (i>=k) return {};
visited[i] = 1;
while (j<k && (visited[j]||sums[j]!=sums[i]-x))
j++;
if (j>=k) return {};
visited[j] = 1;
rets.push_back(sums[j]);
}
return rets;
}
bool dfs(vector<int>sums, int n, vector<int>&rets)
{
if (n==1)
{
if (sums[0]!=0 && sums[1]!=0)
return false;
else
{
rets.push_back(sums[0]==0? sums[1]:sums[0]);
return true;
}
}
int k = sums.size();
sort(sums.begin(), sums.end());
// suppose x is the minimum positive number
int x = sums[k-1]-sums[k-2];
vector<int>sums1 = split1(sums, x);
if (sums1.size()==k/2)
{
rets.push_back(x);
if (dfs(sums1, n-1, rets))
return true;
rets.pop_back();
}
// suppose x is the maximum negative number
x = -(sums[k-1]-sums[k-2]);
vector<int>sums2 = split2(sums, x);
if (sums2.size()==k/2)
{
rets.push_back(x);
if (dfs(sums2, n-1, rets))
return true;
rets.pop_back();
}
return false;
}
};