双指针 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)