一、单调栈定义
- 单调递增栈:数据出栈的序列为单调递增序列(比站内元素小就入栈,否则将栈中比当前元素小的元素弹出后再入栈)
- 单调递减栈:数据出栈的序列为单调递减序列(比站内元素大就入栈,否则将栈中比当前元素大的元素弹出后再入栈)
二、题目
(一)视野总和
【题目】
描叙:有 n 个人站队,所有的人全部向右看,个子高的可以看到个子低的发型,给出每个人的身高,问所有人能看到其他人发现总和是多少。
输入:4 3 7 1
输出:2
输入:20,10,5,7,15,8,6
输出:11
思路:每次入栈的时候,即栈顶元素大于入栈元素的时候,sum加上当前栈内元素个数。
/**
* 视野总和
*描叙:有 n 个人站队,所有的人全部向右看,个子高的可以看到个子低的发型,
* 给出每个人的身高,问所有人能看到其他人发现总和是多少。
*
* 输入:4 3 7 1
* 输出:2
*
* 每次入栈的时候,即栈顶元素大于入栈元素的时候,总和加上当前栈内元素个数
* */
public int sightSum(int[] nums) {
if (nums == null || nums.length==0) return 0;
Stack<Integer> stack = new Stack<>();
int i,sum;
sum = 0;
for (i=0; i<nums.length; i++) {
// 栈为空的时候,sum不变,只是加入元素
if (stack.empty()) {
stack.add(nums[i]);
} else {
// 栈不为空,同时栈顶小于入栈元素
while (!stack.empty() && stack<