题目链接:https://leetcode.cn/problems/next-greater-element-ii/
题目介绍:
思路:
本题与“每日最高温度”的区别在于:
本题改成**循环数组**了
成环之后怎么操作呢?这里提供一种思路,凡是成环的题目都可以这么求解
首先遍历的下标最大值为数组长度的2倍,我们要操作的下标的i对数组长度取模
即:
for (int i = 1; i < nums.length * 2; i++) {
// nums[i % nums.length]
}
其他代码一样
代码:
class Solution {
public int[] nextGreaterElements(int[] nums) {
int[] reuslt = new int[nums.length];
Arrays.fill(reuslt, -1);
Deque<Integer> stack = new LinkedList<>();
stack.push(0);
for (int i = 1; i < nums.length * 2; i++) {
if (nums[i % nums.length] <= nums[stack.peek()]) {
stack.push(i % nums.length);
} else {
while (!stack.isEmpty() && nums[i % nums.length] > nums[stack.peek()]) {
reuslt[stack.peek()] = nums[i % nums.length];
stack.pop();
}
stack.push(i % nums.length);
}
}
return reuslt;
}
}
题目链接:https://leetcode.cn/problems/trapping-rain-water/
题目介绍:
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
思路:
min(左边第一个最大的值,右边第一个最大的值)
,宽度就是右边的下标-左边的下标-1
,当前元素对应的雨水,就是高度乘以宽度得到的面积,最后再求和。代码:
class Solution {
public int trap(int[] height) {
// 用于接收结果
int sum = 0;
Deque<Integer> stack = new LinkedList<>();
stack.push(0);
for (int i = 1; i < height.length; i++) {
if (height[i] <= height[stack.peek()]) {
stack.push(i);
} else {
while (!stack.isEmpty() && height[i] > height[stack.peek()]) {
int mid = stack.pop();
// 因为下面有对栈操作,所以需要判断栈不为空
if (!stack.isEmpty()) {
int left = stack.peek();
int h = Math.min(height[left], height[i]) - height[mid];
int w = i - stack.peek() - 1;
sum += h * w;
}
}
stack.push(i);
}
}
return sum;
}
}