2302. 统计得分小于 K 的子数组数目(双指针,贡献法,子数组问题)

发布时间 2023-12-03 09:58:55作者: 深渊之巅

 

枚举子数组问题,常见有固定一个点,枚举另一个端点,还有枚举中间点。

本题使用双指针算法,对右端点进行枚举,每次累加[l, r]区间内,所有以右端点为结尾的子数组对答案的贡献度,也就是长度 r- l + 1

class Solution:
    def countSubarrays(self, nums: List[int], k: int) -> int:
        res = left = s = 0
        for right, val in enumerate(nums):
            s += val
            while s * (right - left + 1) >= k:
                s -= nums[left]
                left += 1
            res += right - left + 1
        
        return res