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

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

总和小于或等于X的数组中的子序列数

介绍

该算法是一个经典的双指针算法,用于计算总和小于或等于给定数 X 的数组中的子序列数量。它的时间复杂度为 O(n)。

算法
  1. 定义两个指针 i 和 j,初始值均为 0。
  2. 定义一个计数变量 count 和一个累加和变量 sum,初始值均为 0。
  3. 当 j 小于数组的长度时,执行以下步骤:
    • 将 nums[j] 加到 sum 中。
    • 如果 sum 大于 X,则执行以下步骤:
      • 将 nums[i] 从 sum 中减去。
      • 将 i 加一。
    • 将 count 增加 j - i + 1,表示当前 j 对应的子序列数量。
    • 将 j 加一。
  4. 返回 count。
代码示例
def count_subarrays(nums, X):
    i, j = 0, 0
    count, sum = 0, 0
    while j < len(nums):
        sum += nums[j]
        while sum > X:
            sum -= nums[i]
            i += 1
        count += j - i + 1
        j += 1
    return count
测试样例
assert count_subarrays([1, 2, 3, 4], 5) == 7
assert count_subarrays([3, 1, 2, 1], 4) == 7
assert count_subarrays([3, 2, 1, 0], 5) == 6
总结

总和小于或等于 X 的数组中的子序列数问题是双指针算法中的经典问题。本算法采用双指针的方式,通过不断的移动指针来计算出符合条件的子序列数量。该算法时间复杂度为 O(n),效率较高,非常适合用于大规模的数据计算。