题目名称 | 题目链接 |
1.二分查找 | 力扣 |
2.找出数组排序后的目标下标 | 力扣 |
3.寻找重复数 | 力扣 |
4.Binary Deque | Problem - 1692E - Codeforces |
1、(折半查找)
2、
3、
4、
显然,如果数组本身的和就小于 ss,那是肯定无解的。
维护 l,r,suml,r,sum 这几个变量。其中,l,rl,r 分别代表左/右指针,初始值均为一。sumsum 代表从 l 到 r 之和,初始值为 a[1]。
接下来,不断进行以下判断:
-
sum=ssum=s,此时更新答案,并将右指针右移。
-
sum<ssum<s,此时右指针右移以尽可能使 sumsum 增大。
-
sum>ssum>s,此时左指针右移以尽可能使 sumsum 减小。
直到某个指针越界为止。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7;
int a[N];
int main()
{
int T;
scanf("%d",&T);
while(T--) {
int n,s;
scanf("%d%d",&n,&s);
int l = 1, r = 1;
int ans = 1e9;
for(int i = 1; i <= n; i++) {
scanf("%d",&a[i]);
}
int sum = 0;
for(int i = 1; i <= n; i++) {
sum += a[i];
}
if(sum < s)
{
printf("-1\n");
continue;
}
sum = a[1];
while(l <= n && r <= n) {
if(sum == s)
{
ans = min(l - 1 + n - r, ans);
r++;
sum += a[r];
}
else if(sum > s) {
sum -= a[l];
l++;
}
else
{
r++;
sum += a[r];
}
}
printf("%d\n",ans);
}
return 0;
}