会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
题目要求在数组中找一段不含 0、长度介于 1 与 W 之间、且元素和最小的连续子数组;若有多个答案,取起始下标最小者。
首先,0 把数组天然切成若干互不干扰的连续段,答案一定落在某一段内部。对每一段,问题转化为:在一段无 0 数组上求「长度不超过 W 的最小子数组和」。
设段内前缀和为 prefix。任意子数组和可写成 prefix[i]−prefix[j](1≤i−j≤W)。对固定右端点 i,要使该值最小,就要让窗口 [i−W,i−1] 内的 prefix[j] 尽量大。因此用单调队列维护前缀和的滑动窗口最大值,即可在线性时间内处理每一段。
并列时取最左起点:单调队列在前缀和相等时保留更左的下标,并在全局更新时仅在「和更小,或和相同且起点更左」时替换答案。