-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathminimum-operations-to-make-array-parity-alternating.cpp
More file actions
64 lines (58 loc) · 2.02 KB
/
minimum-operations-to-make-array-parity-alternating.cpp
File metadata and controls
64 lines (58 loc) · 2.02 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
// Time: O(n)
// Space: O(1)
// greedy
class Solution {
public:
vector<int> makeParityAlternating(vector<int>& nums) {
static const int POS_INF = numeric_limits<int>::max();
static const int NEG_INF = numeric_limits<int>::min();
const auto& count = [&](int target) {
int cnt = 0;
int mn = POS_INF, mx = NEG_INF;
for (int i = 0; i < size(nums); ++i) {
if ((nums[i] & 1) == ((i & 1) ^ target)) {
mn = min(mn, nums[i]);
mx = max(mx, nums[i]);
} else {
++cnt;
mn = min(mn, nums[i] + 1);
mx = max(mx, nums[i] - 1);
}
}
return vector<int>{cnt, size(nums) == 1 ? 0 : (ranges::max(nums) == ranges::min(nums) ? 1 : mx - mn)};
};
return min(count(0), count(1));
}
};
// Time: O(n)
// Space: O(1)
// greedy
class Solution2 {
public:
vector<int> makeParityAlternating(vector<int>& nums) {
static const int POS_INF = numeric_limits<int>::max();
static const int NEG_INF = numeric_limits<int>::min();
const auto& count = [&](int target) {
int cnt = 0;
int mn = ranges::min(nums), mx = ranges::max(nums);
int mn2 = POS_INF, mx2 = NEG_INF;
for (int i = 0; i < size(nums); ++i) {
if ((nums[i] & 1) == ((i & 1) ^ target)) {
mn2 = min(mn2, nums[i]);
mx2 = max(mx2, nums[i]);
} else {
++cnt;
if (nums[i] == mn) {
mn2 = min(mn2, nums[i] + 1);
mx2 = max(mx2, nums[i] + 1);
} else if (nums[i] == mx) {
mn2 = min(mn2, nums[i] - 1);
mx2 = max(mx2, nums[i] - 1);
}
}
}
return vector<int>{cnt, mx2 - mn2};
};
return min(count(0), count(1));
}
};