Skip to content

Commit 058e699

Browse files
authored
Create minimum-pair-removal-to-sort-array-i.cpp
1 parent fa670d7 commit 058e699

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Time: O(nlogn)
2+
// Space: O(n)
3+
4+
// simulation, doubly linked list, bst
5+
class Solution {
6+
public:
7+
int minimumPairRemoval(vector<int>& nums) {
8+
vector<int64_t> arr(cbegin(nums), cend(nums));
9+
vector<int> left(size(arr) + 1);
10+
iota(begin(left), end(left), -1);
11+
vector<int> right(size(arr));
12+
iota(begin(right), end(right), 1);
13+
int cnt = 0;
14+
set<pair<int64_t, int>> bst;
15+
const auto& add = [&](int i) {
16+
if (0 <= i && i < right[i] && right[i] < size(arr)) {
17+
bst.emplace(arr[i] + arr[right[i]], i);
18+
if (arr[i] > arr[right[i]]) {
19+
++cnt;
20+
}
21+
}
22+
};
23+
24+
const auto& remove = [&](int i) {
25+
if (0 <= i && i < right[i] && right[i] < size(arr)) {
26+
bst.erase({arr[i] + arr[right[i]], i});
27+
if (arr[i] > arr[right[i]]) {
28+
--cnt;
29+
}
30+
}
31+
};
32+
33+
for (int i = 0; i + 1 < size(arr); ++i) {
34+
bst.emplace(arr[i] + arr[i + 1], i);
35+
if (arr[i] > arr[i + 1]) {
36+
++cnt;
37+
}
38+
}
39+
int result = 0;
40+
for (; cnt; ++result) {
41+
const auto [_, i] = *cbegin(bst);
42+
remove(left[i]);
43+
remove(i);
44+
remove(right[i]);
45+
arr[i] += arr[right[i]];
46+
left[right[right[i]]] = i;
47+
right[i] = right[right[i]];
48+
add(left[i]);
49+
add(i);
50+
}
51+
return result;
52+
}
53+
};

0 commit comments

Comments
 (0)