📌  相关文章
📜  一个数中M个连续数字的最大和与乘积(1)

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

关于一个数中M个连续数字的最大和与乘积

当处理数字序列时,我们经常需要找到该序列中连续M个数字的最大和与乘积。在算法和编程中,这是非常常见的问题。下面我们将简单介绍如何通过编程来解决这些问题。

最大和

给定一个长度为N的整数数列,求其连续M个数字之和的最大值。

算法1: 暴力枚举

对于每一组连续的M个数字,都计算它们的和并与已知的最大值进行比较。算法时间复杂度为$O(NM)$

def max_sum(nums, M):
    max_val = float('-inf')
    for i in range(len(nums) - M + 1):
        max_val = max(max_val, sum(nums[i:i+M]))
    return max_val
算法2: 滑动窗口

为了避免不必要的重复计算,在每次滑动窗口计算新的连续M个数字之和时,只需减去窗口前面的数字并添加窗口后面的数字。这样时间复杂度就降低到了$O(N)$

def max_sum(nums, M):
    max_val = float('-inf')
    sum_val = sum(nums[:M])
    for i in range(M, len(nums)):
        sum_val += nums[i] - nums[i-M]
        max_val = max(max_val, sum_val)
    return max_val
最大乘积

给定一个长度为N的正整数数列,求其连续M个数字之积的最大值。

算法1: 暴力枚举

对于每一组连续的M个数字,都计算它们的乘积并与已知的最大值进行比较。算法时间复杂度为$O(NM)$

def max_product(nums, M):
    max_val = float('-inf')
    for i in range(len(nums) - M + 1):
        prod_val = 1
        for j in range(i, i+M):
            prod_val *= nums[j]
        max_val = max(max_val, prod_val)
    return max_val
算法2: 滑动窗口

为了避免不必要的重复计算,在每次滑动窗口计算新的连续M个数字之积时,只需将窗口前面的数字除去并乘上窗口后面的数字。这样时间复杂度就降低到了$O(N)$

def max_product(nums, M):
    max_val = float('-inf')
    prod_val = 1
    for i in range(M):
        prod_val *= nums[i]
    for i in range(M, len(nums)):
        prod_val = prod_val//nums[i-M]*nums[i]
        max_val = max(max_val, prod_val)
    return max_val