📌  相关文章
📜  数组中总和小于或等于 X 的子序列计数(1)

📅  最后修改于: 2023-12-03 15:26:11.158000             🧑  作者: Mango

数组中总和小于或等于 X 的子序列计数
问题描述

给定一个整数数组 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),没有使用额外的空间。

应用场景

该算法常用于求解一些区间和的问题,例如:区间和的最大值、区间和的平均值等等。同时,该算法还可以用于求解一些滑动窗口的问题,例如:最长连续子数组等。