Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务活动详情
未完成版本
一、题目描述
给定一个数组,求一个最短的子数组且其和要大于给定的K
数据范围
N <= 100000
二、思路分析
首先,我不假思索地写了个滑动窗口,很朴素的滑动窗口,但是事实证明会被卡,并不是最优的。所以
三、AC代码
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
int l=0,r=-1,tot=0,n=nums.size();
int ans = 999999999;
while (r < n) {
if (tot < k) {
r++;
if (r == n) {
while (l < n) {
tot-=nums[l];
l++;
if (tot >= k ) {
ans = min(ans,r-l);
printf("%d %d",l,r);
}
}
break;
}
tot+=nums[r];
continue;
}
ans = min(ans,r-l+1);
if (tot - nums[l] >= k) {
tot -= nums[l];
l++;
} else {
r++;
if (r == n) {
while (l < n) {
tot-=nums[l];
l++;
if (tot >= k ) {
ans = min(ans,r-l);
}
}
break;
}
tot+=nums[r];
}
}
if (ans == 999999999) return -1;
return ans;
}
};