题目链接:https://leetcode-cn.com/problems/binary-subarrays-with-sum/
开心滑动窗口,特判可有可无但是对于神奇样例会快一点。记得双指针的界限要放在最前面!!!
代码如下:
class Solution {
public:
int numSubarraysWithSum(vector<int>& A, int S) {
// 特判
int sum = 0;
for(int i = 0; i < A.size(); i++) {
sum += A[i];
}
if(S > sum || S < 0) {
return 0;
}
// 初始化
int i = 0, j = 0, index = 0;
int res = 0;
sum = 0;
// 滑动窗口
while(j < A.size()) {
i = index;
sum += A[j];
while(sum > S) {
if(i >= j) {
break;
}
sum -= A[i];
i++;
}
index = i;
int pos = sum; //由于下面要记录还有多少可能,会改变sum,但是sum在下一次循环还会用到,所以要用一个临时变量代替一下。
while(pos == S) {
res++;
if(i >= j) {
break;
}
pos -= A[i];
i++;
}
printf("index = %d, i = %d, j = %d, res = %d\n", index, i, j, res);
j++;
}
return res;
}
};