题目要求在数组中找一段不含 0、长度介于 1 与 W 之间、且元素和最小的连续子数组;若有多个答案,取起始下标最小者。
首先,0 把数组天然切成若干互不干扰的连续段,答案一定落在某一段内部。对每一段,问题转化为:在一段无 0 数组上求「长度不超过 W 的最小子数组和」。
设段内前缀和为 prefix。任意子数组和可写成 prefix[i]−prefix[j](1≤i−j≤W)。对固定右端点 i,要使该值最小,就要让窗口 [i−W,i−1] 内的 prefix[j] 尽量大。因此用单调队列维护前缀和的滑动窗口最大值,即可在线性时间内处理每一段。
并列时取最左起点:单调队列在前缀和相等时保留更左的下标,并在全局更新时仅在「和更小,或和相同且起点更左」时替换答案。
数据中心使用一个整数数组 scores,记录 N 小时内每小时的服务器得分(可正可负)。0 表示服务器故障(无效小时)。
你需要找到一个连续子数组作为维护窗口,满足以下条件:
N:总小时数(1≤N≤100000);
W:窗口长度(1≤W≤min(N,10000));
scores:长度为 N 的整数数组,表示每小时的得分。
一个包含两个整数的数组 [start_index, min_sum],其中 start_index 是子数组的起始下标(从 0 开始),min_sum 是最小和。
如果不存在满足条件的子数组(如数组全为 0),返回 [-1, 0]。
输入
4,3,[0,0,0,0]
输出
[-1,0]
说明
[-1,0]。输入
4,3,[-10,5,-10,5]
输出
[0,-15]
说明
输入
6,3,[-3,0,-5,-2,0,-6]
输出
[2,-7]
说明
-3,0,-5 不能构成连续窗口。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册