Day59代码随想录
503.下一个更大元素II
1.题目描述
给定一个循环数组 nums
( nums[nums.length - 1]
的下一个元素是 nums[0]
),返回 nums
中每个元素的 下一个更大元素 。
数字 x
的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1
。
示例 1:
输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
示例 2:
输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]
2.解题思路及代码实现
就重新构建一个2n-1的数组,将前n-1插入到后面,然后依次构建单调栈,最后取前n个当作res
class Solution {
public int[] nextGreaterElements(int[] nums) {
int n = nums.length;
int[] res = new int[n];
int[] newnums = new int[2*n-1];
int[] newnums2 = new int[2*n-1];
Arrays.fill(newnums2,-1);
for (int i = 0; i < 2 * n-1; i++) {
newnums[i] = nums[i%n];
}
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < 2*n-1; i++) {
while(!stack.empty()&&newnums[i]>newnums[stack.peek()]){
int index = stack.pop();
newnums2[index] = newnums[i];
}
stack.push(i);
}
for (int i = 0; i <n; i++) {
res[i] = newnums2[i];
}
return res;
}
}
42.接雨水
1.题目描述
给定 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 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
2.解题思路及代码实现
本题我就掌握了双指针的思路
class Solution {
public int trap(int[] height) {
int n = height.length;
int[] premax = new int[n];
int[] postmax = new int[n];
premax[0] = height[0];
for (int i = 1; i < n; i++) {
premax[i] = Math.max(premax[i-1],height[i]);
}
postmax[n-1] = height[n-1];
for (int i = n-2; i >=0 ; i--) {
postmax[i] = Math.max(postmax[i+1],height[i]);
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum+=Math.min(premax[i],postmax[i])-height[i];
}
return sum;
}
}