503.下一个更大元素
文章
思路
把遍历范围再扩大一倍即可
代码
class Solution {
public int[] nextGreaterElements(int[] nums) {
int i, n;
n = nums.length;
int[] ans = new int[n];
Arrays.fill(ans, -1);
Deque<Integer> dq = new LinkedList<>();
for (i = 0; i < 2 * n; ++i) {
while (!dq.isEmpty() && nums[dq.peek() % n] < nums[i % n]) {
ans[dq.poll() % n] = nums[i % n];
}
dq.push(i);
}
return ans;
}
}
42.接雨水
文章
思路
双指针法我并不会
单调栈反而感觉好写
遍历数组维护递减的单调栈
遇到大于栈顶元素的元素时,弹出栈顶元素作为容器底,从左右选出短板与容器底作差,算水量、
代码
class Solution {
public int trap(int[] height) {
int sum = 0;
int slot = 0;
int i, n;
n = height.length;
int cur, inc;
Deque<Integer> dq = new LinkedList<>();
for (i = 0; i < n; ++i) {
slot = 0;
while (!dq.isEmpty() && height[dq.peek()] < height[i]) {
cur = dq.poll();
if (!dq.isEmpty()) {
inc = (Math.min(height[i], height[dq.peek()]) - height[cur]) * (i - dq.peek() - 1);
slot += inc;
// System.out.println(" " + inc + ", " + height[i] + ", " + height[dq.peek()] + ", " + height[cur]);
}
}
sum += slot;
dq.push(i);
}
return sum;
}
}
总结
N刷的经典老题了