双指针 or 滑动窗口
i:区间左指针; j:区间右指针。两个指针都分别向右移动
- 右移 j (增大窗口):
当前窗口内的子数组和(s) += nums[j]
- 在 j 位置固定的情况下,不断右移 i (缩小窗口):
! 由于数组元素都是正整数,因此大区间的和一定大于小区间的和。
因此,若当前区间[i, j]满足之和(s) >=x,则区间[i, k]一定满足之和 >=x(j < k < n)因此,每次cnt += n - j。
直至窗口内的的子数组和(s)< x,i 停止移动。
n, x = list(map(int, input().split()))
nums = list(map(int, input().split()))
i, j, s, cnt = 0, 0, 0, 0
while j < n:
s += nums[j]
while i <= j and s >= x:
cnt += n - j # !!!
# 缩小窗口
s -= nums[i]
i += 1
# 增大窗口
j += 1
print(cnt)

京公网安备 11010502036488号