2024-11-17 Daily Challenge
Today I have done leetcode's November LeetCoding Challenge with cpp.
November LeetCoding Challenge 17
Description
Shortest Subarray with Sum at Least K
Given an integer array nums and an integer k, return the length of the shortest non-empty subarray of nums with a sum of at least k. If there is no such subarray, return -1.
A subarray is a contiguous part of an array.
Example 1:
Input: nums = [1], k = 1 Output: 1
Example 2:
Input: nums = [1,2], k = 4 Output: -1
Example 3:
Input: nums = [2,-1,2], k = 3 Output: 3
Constraints:
1 <= nums.length <= 105-105 <= nums[i] <= 1051 <= k <= 109
Solution
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
int answer = INT_MAX;
deque<pair<long long, int>> dq;
long long total = 0;
int current = 0;
for(auto n : nums) {
if(n >= 0) {
dq.push_back({n, 1});
total += n;
current += 1;
} else {
if(total + n <= 0) {
dq.clear();
total = 0;
current = 0;
continue;
} else {
auto [sum, len] = dq.back();
dq.pop_back();
long long currentSum = n + sum;
int segLen = 1 + len;
while(dq.size() && currentSum < 0) {
auto [s, l] = dq.back();
dq.pop_back();
currentSum += s;
segLen += l;
}
total += n;
dq.push_back({currentSum, segLen});
current += 1;
}
}
while(dq.size() && total >= k) {
answer = min(answer, current);
auto [s, l] = dq.front();
dq.pop_front();
total -= s;
current -= l;
}
}
return answer == INT_MAX ? -1 : answer;
}
};