leetcode 第907题 子数组的最小值之和 python解法
问题分析
问题如下(传送门),题目的意思是将数组所有的连续子数组找到,然后将所有子数组中的最小值找到并求和。
最简单的方法就是找到所有的子数组,然后得到最小值和。但这样最后肯定会超时的,不予考虑。
题目的提示是用栈来做这个题目,所以先往这方向上想。进一步分析,假设从数组的头部遍历,如果后面的数大于前面的数。那么这两个数构成的子数组取得肯定是前面的小的数;如果后面的数小于前面的数,那么子数组就得取后面的数。
那么先建立一个栈,这个栈中的元素是递增的,此外还建立一个辅助栈,这个栈主栈同时出入栈,大小保持一致。辅助栈每个元素包含两个数,第一个数是原数组在该元素前所有元素与此元素构成的子数组最小值和,第二个数就是此元素在原数组中前面连续小于它的数的个数。
以数组[]2, 4, 5, 3, 6]来做例子。刚开始为了保证栈不为空,所以先在栈中加入了0(原数组的所有数大于0)。那么2,4,5都是递增的所以直接加入主栈。在辅助栈中,2加入,与前面(实际上没有)元素构成的子数组最小值和为2,第二个加入4,它可以与2构成子数组