-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path0805-split-array-with-same-average.js
More file actions
106 lines (91 loc) · 2.5 KB
/
0805-split-array-with-same-average.js
File metadata and controls
106 lines (91 loc) · 2.5 KB
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
99
100
101
102
103
104
105
106
/**
* Split Array With Same Average
* Time Complexity: O(2^(N/2) + (N/2)^3 * MAX_ABS_VAL)
* Space Complexity: O(N * MAX_ABS_VAL)
*/
var splitArraySameAverage = function (nums) {
const totalElementsCount = nums.length;
if (totalElementsCount === 1) {
return false;
}
const overallElementsSum = nums.reduce(
(initialAccumulator, currentArrayValue) =>
initialAccumulator + currentArrayValue,
0,
);
const firstHalfCountLimit = Math.floor(totalElementsCount / 2);
const firstHalfCollections = Array(firstHalfCountLimit + 1)
.fill()
.map(() => new Set());
const generateSubsetsRecursively = (
startIndexValue,
endIndexValue,
currentSubsetElementsCount,
currentSubsetSumValue,
sumSetsContainer,
) => {
if (startIndexValue === endIndexValue) {
sumSetsContainer[currentSubsetElementsCount].add(currentSubsetSumValue);
return;
}
generateSubsetsRecursively(
startIndexValue + 1,
endIndexValue,
currentSubsetElementsCount,
currentSubsetSumValue,
sumSetsContainer,
);
generateSubsetsRecursively(
startIndexValue + 1,
endIndexValue,
currentSubsetElementsCount + 1,
currentSubsetSumValue + nums[startIndexValue],
sumSetsContainer,
);
};
generateSubsetsRecursively(
0,
firstHalfCountLimit,
0,
0,
firstHalfCollections,
);
const secondHalfCountLimit = totalElementsCount - firstHalfCountLimit;
const secondHalfCollections = Array(secondHalfCountLimit + 1)
.fill()
.map(() => new Set());
generateSubsetsRecursively(
firstHalfCountLimit,
totalElementsCount,
0,
0,
secondHalfCollections,
);
for (let subsetLenA = 0; subsetLenA <= firstHalfCountLimit; subsetLenA++) {
for (const subsetSumA of firstHalfCollections[subsetLenA]) {
for (
let subsetLenB = 0;
subsetLenB <= secondHalfCountLimit;
subsetLenB++
) {
const combinedSubsetLength = subsetLenA + subsetLenB;
if (
combinedSubsetLength === 0 ||
combinedSubsetLength === totalElementsCount
) {
continue;
}
const combinedTargetSum =
(overallElementsSum * combinedSubsetLength) / totalElementsCount;
if (combinedTargetSum % 1 !== 0) {
continue;
}
const neededSumB = combinedTargetSum - subsetSumA;
if (secondHalfCollections[subsetLenB].has(neededSumB)) {
return true;
}
}
}
}
return false;
};