一、503.下一个更大元素II
- 重要!凡是转圈的题,都可以用取模的方式!
public int[] nextGreaterElements(int[] nums) {
int[] result = new int[nums.length];
Arrays.fill(result,-1);
LinkedList<Integer> stack = new LinkedList<>();
stack.add(0);
for(int i=1;i<2*nums.length;i++){
if(nums[i%nums.length]<= nums[stack.peekLast()]){
// stack.add(i);
stack.add(i%nums.length);
} else{
while(!stack.isEmpty()&&nums[i%nums.length]> nums[stack.peekLast()]){
result[stack.peekLast()] = nums[i%nums.length];
stack.removeLast();
}
// stack.add(i);
stack.add(i%nums.length);
}
}
return result;
}
11分钟
二、42. 接雨水
- 三个数的比较,先弹出一个中间数,然后计算高和宽,得出面积
public int trap(int[] height) {
int[] result = new int[height.length];
LinkedList<Integer> stack = new LinkedList<>();
stack.add(0);
int sum = 0;
for (int i = 1; i < height.length; i++) {
if (height[i] <= height[stack.peekLast()]) {
stack.add(i);
} else {
while (!stack.isEmpty() && height[i] > height[stack.peekLast()]) {
int mid = stack.removeLast();
if (!stack.isEmpty()) {
int h = Math.min(height[stack.peekLast()], height[i]) - height[mid];//左右高度最小值-中间柱子的高度
int w = i - stack.peekLast() - 1;
int area = h * w;
sum += area;
// stack.
}
}
stack.add(i);
}
}
return sum;
}
46分钟