今日头条笔试题:“最小数字*区间和”的最大值【单调栈】

 

题目描述:

  给定一段数组,求每个区间的最小值乘这段区间的和,输出每个区间得到的最大值。

  样例输入:[1 2 6],可能有以下几种情况:

  •   [1]:结果为1*1=1;
  •   [2]:结果为2*2=4;
  •   [6]:结果为6*6=36;
  •   [1,2]:结果为1*(1+2)=3;
  •   [2,6]:结果为2*(2+6)=16;
  •   [1,2,6]:结果为1*(1+2+6)=9;

  最大值为36,输出36即可。

  核心 :💗 可以在O(n)时间内确定以每个数字为最小数字连续区间的边界!

      方法: 单调栈

解法:

  利用单调栈,从前向后和从后向前分别便利一遍数组,得到每个元素的左边界和右边界(便捷的定义即为碰到比该元素更小的即停止),最后用每个元素乘以每个元素对应的区间和,找出最大值即可。这里有一个技巧,为了防止每个元素重复计算一段区间和,可以提前开一个递增序列,用于保存某元素之前的各项和(含该元素),求取一段区间和的时候用右边界的递增和减去左边界减一的递增和即可。