在Python中找到最大子数组的最小乘积的程序

在Python中找到最大子数组的最小乘积的程序

假设我们有一个数组nums,我们必须找到nums的每个非空子数组的最大min-product。 由于答案可能足够大,因此在模10 ^ 9 + 7中返回它。 数组的min-product等于数组中的最小值乘以数组的总和。 因此,如果我们有像[4,3,6]这样的数组(最小值为3),则最小乘积为3 *(4 + 3 + 6)= 3 * 13 = 39。

所以,如果输入是nums = [2,3,4,3],则输出将是30,因为我们可以获取子数组[3,4,3]以最大化结果,因此3 *(3 + 4 + 3)= 3 * 10 = 30。

要解决此问题,我们将执行以下步骤:

  • m:= 10 ^ 9 + 7

  • stack:=新堆栈

  • rSum:= 0,res:= 0

  • 在nums末尾插入0

  • 对于nums中的每个索引i和值v,执行以下操作

    • while stack不为空且nums [堆栈顶部索引的值] ≥ v,执行
      • index,val):=堆栈顶部和从堆栈中弹出它

      • arrSum:= rSum

      • 如果堆栈不为空,则

      • arrSum:= rSum-堆栈顶部值

      • res:= res和(nums [index] * arrSum)的最大值

    • rSum:= rSum + v

    • 在堆栈末尾插入(i,rSum)

  • 返回res mod m

示例

让我们看看以下实现,以更好地了解 –

def solve(nums):
   m = int(1e9+7)
   stack = []
   rsum = 0
   res = 0

   nums.append(0)

   for i, v in enumerate(nums):
      while stack and nums[stack[-1][0]] >= v:
         index, _ = stack.pop()

         arrSum=rsum

         if stack:
            arrSum=rsum-stack[-1][1]

         res=max(res, nums[index]*arrSum)

      rsum += v
      stack.append((i, rsum))

   return res % m

nums = [2,3,4,3]
print(solve(nums))

输入

[2,3,4,3]

输出

30

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程