【LeetCode 862】Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务

121 阅读1分钟

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;
    }
};

四、总结