📅  最后修改于: 2023-12-03 15:26:11.158000             🧑  作者: Mango
给定一个整数数组 nums 和一个整数 X,求该数组中总和小于或等于 X 的子序列个数。
使用两个指针 left 和 right,表示子序列的左右边界。遍历数组,如果当前子序列的和小于等于 X,则将右指针右移,否则将左指针右移。
具体实现时,可以使用双指针和滑动窗口的思路。定义一个变量 sum 记录当前子序列的和,然后不断尝试将 right 指针右移,直到 sum 大于 X 或者 right 达到数组末尾。此时,以 left 结尾的子序列的数量即为 right - left,将其加入结果中,并将 left 右移。重复上述过程,直到 right 达到数组末尾。
def countSubarrays(nums, X):
n = len(nums)
left, right = 0, 0
res = 0
sum = 0
while left < n:
while right < n and sum + nums[right] <= X:
sum += nums[right]
right += 1
res += right - left
sum -= nums[left]
left += 1
return res
该算法的时间复杂度为 O(n),其中 n 为数组的长度。因为每个元素最多被访问两次,所以时间复杂度为线性。
该算法的空间复杂度为 O(1),没有使用额外的空间。
该算法常用于求解一些区间和的问题,例如:区间和的最大值、区间和的平均值等等。同时,该算法还可以用于求解一些滑动窗口的问题,例如:最长连续子数组等。