2302. 统计得分小于 K 的子数组数目

  1. 题目链接
  2. 思路
    • 子数组题目,首先想到以i开头,或者以i结尾是什么情况。
    • 所有的数字是正数,因此有很明显的单调性:大子数组符合要求,那么小子数组肯定符合要求;小子数组不符合要求,大子数组肯定不符合要求。因此,可以使用滑动窗口,若[L, R]满足,那么看R++是否满足;若R不满足了,此时可以结算,以L开头的子数组了,以L开头的子数组,最长就是[L, R),刚好是R - L个。
  1. 代码

    class Solution:
        def countSubarrays(self, nums: List[int], k: int) -> int:
            # 滑动窗口
            L = 0
            R = 0
            pre_count = 0
            ans = 0
            while R < len(nums) and L < len(nums):
                if L > R:
                    pre_count += nums[R]
                    R += 1
                # R能进窗口吗?
                pre_count += nums[R]
                if pre_count * (R - L + 1) < k: # 能进
                    R += 1
                else: # 不能进,记得结算[L, R)
                    ans += R - L
                    pre_count -= nums[R]
                    pre_count -= nums[L]
                    L += 1
            if L >= len(nums):
                pass
            else:
                R = min(R, len(nums) - 1)
                ans += (R - L + 2) * (R - L + 1) / 2
            return ans
    
posted @ 2025-04-28 10:38  ouyangxx  阅读(7)  评论(0)    收藏  举报