和至少为 K 的最短子数组
问题描述 :
返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 。如果没有和至少为 K 的非空子数组,返回 -1 。
示例 1:
输入:A = [1], K = 1
输出:1
示例 2:
输入:A = [1,2], K = 4
输出:-1
示例 3:
输入:A = [2,-1,2], K = 3
输出:3
说明:
1 <= A.length <= 50000,-10 ^ 5 <= A[i] <= 10 ^ 5,1 <= K <= 10 ^ 9
可参考以下main函数:
int main()
{
vector<int> A;
int n,data,k;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>data;
A.push_back(data);
}
cin>>k;
int result=Solution().shortestSubarray(A,k);
cout<<result<<endl;
return 0;
}
输入说明 :
首先输入A数组元素的数目n,然后输入n个整数,最后输入k。
输出说明 :
输出一个整数,表示结果
输入范例 :
3
2 -1 2
3
输出范例 :
3
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int shortestSubarray(vector<int>& A,int K){
int n = A.size();
vector<int> sum(n+1, 0);
for(int i=0;i<n; i++){
sum[i+1]=sum[i]+A[i];//前i项之和存入sum[i]
}
deque<int> de;//双端队列
int j = 0;
int res = n+1;
while(j<=n){
while(!de.empty()&&sum[j]<=sum[de.back()]){ //我们确定我们前面没有高个,有就踢他
de.pop_back();
}
while(!de.empty()&&sum[j]-sum[de.front()]>=K){ //从最前面第一位同学开始,进行比较
res = min(res,j-de.front());
de.pop_front();
}
de.push_back(j); //最后才坐下去
j++;
}
if(res == n+1)
return -1;
else
return res;
}
int main(){
vector<int> A;
int n,data,k;
cin>>n;
for(int i=0; i<n; i++){
cin>>data;
A.push_back(data);
}
cin>>k;
int result=shortestSubarray(A,k);
cout<<result<<endl;
return 0;
}