代码随想录算法训练营第五十九天 | 下一个更大元素 II、接雨水
● 今日学习的文章链接和视频链接
● 看到题目的第一想法
基本套路差不多 就是找第一个更大的
● 看完代码随想录之后的想法
接雨水还是尽量掌握双指针的更简单
● 实现过程中遇到哪些困难
接雨水
● 解题代码
-
点击查看代码
class Solution { public int[] nextGreaterElements(int[] nums) { if(nums.length == 1) return new int[]{-1}; int len = nums.length; int size = nums.length; int[] result = new int[len]; Stack<Integer> stack = new Stack<>(); stack.push(0); Arrays.fill(result,-1);//默认全部初始化为-1 for(int i = 1;i < 2 * nums.length;i++){ if(nums[i % size] <= nums[stack.peek()]){ stack.push(i % size); }else if(!stack.isEmpty() && nums[i % size] > nums[stack.peek()]){ while(!stack.isEmpty() && nums[i % size] > nums[stack.peek()]){ result[stack.peek()] = nums[i % size]; stack.pop(); } stack.push(i % size); } } return result; } } -
点击查看代码
class Solution { public int trap(int[] height) { int size = height.length; if(size <= 2) return 0; Stack<Integer> stack = new Stack<Integer>(); stack.push(0); int sum = 0; for(int index = 1;index < size;index++){ int stackTop = stack.peek(); if(height[index] < height[stackTop]){ stack.push(index); }else if(height[index] == height[stackTop]){ stack.pop(); stack.push(index); }else{ int heightAtIdx = height[index]; while (!stack.isEmpty() && (heightAtIdx > height[stackTop])){ int mid = stack.pop(); if (!stack.isEmpty()){ int left = stack.peek(); int h = Math.min(height[left], height[index]) - height[mid]; int w = index - left - 1; int hold = h * w; if (hold > 0) sum += hold; stackTop = stack.peek(); } } stack.push(index); } } return sum; } }
● 今日收获,学习时长
今日收获:继续学习了单调栈
学习时长:1h
浙公网安备 33010602011771号