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

浙公网安备 33010602011771号