📅  最后修改于: 2023-12-03 15:06:09.486000             🧑  作者: Mango
当处理数字序列时,我们经常需要找到该序列中连续M个数字的最大和与乘积。在算法和编程中,这是非常常见的问题。下面我们将简单介绍如何通过编程来解决这些问题。
给定一个长度为N的整数数列,求其连续M个数字之和的最大值。
对于每一组连续的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
为了避免不必要的重复计算,在每次滑动窗口计算新的连续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个数字之积的最大值。
对于每一组连续的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
为了避免不必要的重复计算,在每次滑动窗口计算新的连续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