907. 子数组的最小值之和(单调栈)

心情:每次写说明心态肯定是崩的、、、、

关于单调栈的解释,这个博主讲的很好单调栈

我这里只想记录一下,能用到单调栈的情况:
比如这题,还有求最小图形的,这些题都有个特点,就是连续,且求最值。

其实这种题目最原始的想法,就是找以当前点为中心满足条件的一个范围,意思就是在当前节点的基础上,往左和往右循环,找出能延展的最大范围,但这样做往往会超时,于是就有了单调栈。

单调栈是一种结构,其实这个结构很好理解,但往往我们要用到的是它前后左右的关系。

打个比方,单调递减栈(如 1,3,4…)由于栈里面保存的是有序的,也就是说当你再想放一个节点进去:
1.如果大于栈顶元素,那么你要知道的道理是,栈顶元素一定是比你当前节点小的第一个元素!!!,这个结论是很有用的,比如你想求一个子集里面以当前节点是最小值的子集范围,那向左最多延展到栈顶节点,这道题同样也是。
2.如果小于栈顶元素,那么又有一个结论,当前栈顶元素向右小于它的第一个元素,就是当前元素,这样又确定了向右的范围。

有了这两个结论,就很好求了!!!

你可能感兴趣的:(C++,LeeCode刷题)