和至少为 K 的最短子数组

和至少为 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值