Leetcode862-和至少为K的最短子数组

博客介绍了一种利用前缀和与单调队列解决数组问题的方法。先求出nums数组的前缀和数组,遍历过程中维护单调队列。当前枚举的前缀和与队头前缀和之差大于等于k时弹出队头并更新答案,队尾前缀和大于等于当前枚举的前缀和时弹出队尾。时间和空间复杂度均为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法:前缀和+单调队列

求出nums数组的前缀和数组,依次进行遍历同时维护一个单调队列。当当前枚举的前缀和减去队头的前缀和之差大于等于k,则弹出队头,同时更新答案;当队尾的前缀和大于等于当前枚举的前缀和,则弹出队尾。

class Solution {
public:
    int shortestSubarray(vector<int>& nums, int k) {
        int ans=-1,cur=0;
        int n=nums.size();
        vector<long long> s(n+1,0);
        for(int i=0;i<n;i++){
            s[i+1]=s[i]+nums[i];
        }
        deque<int> q;
        for(int i=0;i<=n;i++){
            long long cur=s[i];
            while(!q.empty()&&cur-s[q.front()]>=k){
                if(ans==-1||ans>i-q.front()) ans=i-q.front();
                q.pop_front();
            }
            while(!q.empty()&&s[q.back()]>=cur){
                q.pop_back();
            }
            q.push_back(i);
        }
        return ans;
    }
};

时间复杂度:O(n),每一个元素都入队出队一次。

空间复杂度:O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值