-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdaily153.cpp
More file actions
69 lines (55 loc) · 1.79 KB
/
Copy pathdaily153.cpp
File metadata and controls
69 lines (55 loc) · 1.79 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
// Solution 1 - FAIL
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
/*
prefix sum
sliding window + deque
*/
auto n = nums.size();
auto prefix = std::vector<int>(n, 0);
prefix[0] = nums[0];
for (auto i = 1; i < n; ++i) {
prefix[i] = prefix[i - 1] + nums[i];
}
auto shortest = INT_MAX;
auto dq = std::deque<int>{};
for (auto i = 0; i < n; ++i) {
while (!dq.empty() and prefix[i] - prefix[dq.front()] >= k) {
shortest = std::min(shortest, i - dq.front());
dq.pop_front();
}
while (!dq.empty() and prefix[i] <= prefix[dq.back()])
dq.pop_back();
dq.push_back(i);
}
return shortest == INT_MAX ? -1 : shortest;
}
};
// Solution 2
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
int res = INT_MAX;
long long curSum = 0;
deque<pair<long long, int>> q; // (prefix_sum, end_idx)
for (int r = 0; r < nums.size(); r++) {
curSum += nums[r];
if (curSum >= k) {
res = min(res, r + 1);
}
// Find the minimum valid window ending at r
while (!q.empty() && curSum - q.front().first >= k) {
auto [prefix, endIdx] = q.front();
q.pop_front();
res = min(res, r - endIdx);
}
// Validate the monotonic deque
while (!q.empty() && q.back().first > curSum) {
q.pop_back();
}
q.push_back({curSum, r});
}
return res == INT_MAX ? -1 : res;
}
};