涉及算法:滑动窗口(同向双指针)
解决思路:
- 定义两个指针 left = 0, right = 0;
-
right向后遍历数组
进窗口:sum += arr[right]
判断:如果 sum >= x,就重复以下操作:
(1)更新结果:如果比当前区间的长度 len 更小,则更新最终的左右指针
(2)出窗口:sum -= arr[left] , 同时left++
C++代码实现如下:
#include <iostream>
using namespace std;
const int N = 1e7 + 10;
int arr[N];
int n, x;
int main()
{
cin >> n >> x;
for(int i = 1; i <= n; i++) cin >> arr[i]; // 下标从1开始
// 滑动窗口解决
int left = 0, right = 0, sum = 0;
int len = N, l = -1, r = -1;
while(right <= n)
{
// 进窗口
sum += arr[right];
// 判断
while(sum >= x)
{
// 更新结果
if(len > right - left + 1)
{
len = right - left + 1;
l = left, r = right;
}
// 出窗口
sum -= arr[left++];
}
// 准备下一次进窗口
right++;
}
cout << l << " " << r;
return 0;
}

京公网安备 11010502036488号