题目分析
这道题的核心在于寻找满足特定和条件的连续子数组。面对这类问题,暴力枚举虽然可行但效率较低,使用滑动窗口(双指针)可以将复杂度降低到 O(n)。
解题思路
我们需要维护一个窗口 [prev, cur],并计算窗口内元素的总和 sum。 初始时,两个指针都指向数组头部。随着 cur 向右移动,sum 不断增加。一旦 sum 大于等于目标值 x,说明当前窗口可能是一个候选答案。此时,为了找到更短的子数组,我们尝试收缩左边界 prev,同时更新最优解记录。只要窗口内的和依然满足条件,就继续收缩,直到不满足为止。这个过程不断重复,直到 cur 遍历完整个数组。
关键点在于如何更新最优解。当发现新的满足条件的窗口时,比较其长度与已记录的最优长度。如果新窗口更短,或者长度相同但起始位置更靠前(根据具体题目要求),则更新记录。
代码实现
下面直接给出核心逻辑的代码实现,包含了输入读取、逻辑判断以及结果输出。注意下标从 0 开始,最终输出时需要加 1 转换为 1-based 索引。
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 输入处理
int n, x;
cin >> n >> x;
vector<int> arr(n, 0);
for(int i = 0; i < n; i++) {
cin >> arr[i];
}
// 初始化结果索引,用于保存最后找到的最优区间
int index[2] = {0};
// 滑动窗口变量
int cur = 0;
int prev = 0;
int sum = 0;
while(cur < n) {
sum += arr[cur];
// 当窗口和满足条件时,尝试收缩左边界
while(sum >= x) {
// 第一次找到解或需要更新更优解
if(index[0] == 0 && index[] == ) {
index[] = prev;
index[] = cur;
sum -= arr[prev++];
;
}
length = index[] - index[];
camplen = cur - prev;
(length == camplen || length > camplen) {
(prev < index[] || length > camplen) {
index[] = prev;
index[] = cur;
}
}
sum -= arr[prev++];
}
cur++;
}
cout << index[] + << << index[] + << endl;
;
}


