Leetcode 1856. Maximum Subarray Min-Product [Python]

一道奇怪的题目,用单调栈。
遍历array中的元素,然后对比栈顶的数字,
如果比栈顶的大,入栈。

如果比栈顶的小,栈顶元素出栈。
此时,被从栈顶元素开始往回看,因为是单调上升的单调栈,其之后的元素一定小于栈顶这个元素。于是,每次弹出的元素,都是原本栈顶元素对应的位置往回遍历到当前栈顶元素中的最小值。于是,我们可以更新此时的susbarry的计算值。我们还需要注意的是,每次遍历到的值入栈,我们都入栈这个值,以及这个值往回看,作为最小值可以到达的最左侧的位置。也就是这个值为最小值的subarray的最左侧起始位置。

class Solution:
    def maxSumMinProduct(self, nums: List[int]) -> int:
        Mod = 10**9 + 7
        prefixsum = [0 for _ in range(len(nums) + 1)]
        for i in range(len(nums)):
            prefixsum[i+1] = prefixsum[i] + nums[i]
        res = float('-inf')
        stack = []
        
        # [a, b, c, d, e]
     # [0,sa,sb,sc,sd,se]
        
        for i in range(len(nums)):
            start = i
            while stack and stack[-1][1] > nums[i]:
                start, value = stack.pop()
                res = max(res, value*(prefixsum[i] - prefixsum[start]))
            stack.append((start, nums[i]))
        
        while stack:
                start, value = stack.pop()
                res = max(res, value*(prefixsum[len(nums)] - prefixsum[start]))
        return res%Mod

你可能感兴趣的:(Leetcode学习记录,leetcode,算法)