classSolution{publicint[]dailyTemperatures(int[] temperatures){int n = temperatures.length;int[] ans =newint[n];Stack<Integer> stack =newStack<>();stack.push(0);for(int i =1; i < n; i++){if(temperatures[i]<= temperatures[stack.peek()])stack.push(i);else{while(!stack.isEmpty()&& temperatures[i]> temperatures[stack.peek()]){ans[stack.peek()]= i - stack.pop();}stack.push(i);}}return ans;}}
496.下一个更大元素 I
classSolution{publicint[]nextGreaterElement(int[] nums1,int[] nums2){Stack<Integer> stack =newStack<>();int[] ans =newint[nums1.length];Arrays.fill(ans,-1);Map<Integer,Integer> map =newHashMap<>();for(int i =0; i < nums1.length; i++)map.put(nums1[i], i);stack.push(0);for(int i =1; i < nums2.length; i++){if(nums2[i]<= nums2[stack.peek()])stack.push(i);else{while(!stack.isEmpty()&& nums2[i]> nums2[stack.peek()]){if(map.containsKey(nums2[stack.peek()])){ans[map.get(nums2[stack.peek()])]= nums2[i];}stack.pop();}stack.push(i);}}return ans;}}
503.下一个更大元素 II
classSolution{publicint[]nextGreaterElements(int[] nums){int n = nums.length;int[] ans =newint[n];Arrays.fill(ans,-1);Stack<Integer> stack =newStack<>();for(int i =0; i <2* n; i++){while(!stack.isEmpty()&& nums[i % n]> nums[stack.peek()]){ans[stack.pop()]= nums[i % n];}stack.push(i % n);}return ans;}}
42.接雨水
classSolution{publicinttrap(int[] height){Stack<Integer> stack =newStack<>();int sum =0;for(int i =0; i < height.length; i++){while(!stack.isEmpty()&& height[i]> height[stack.peek()]){int h_pop = height[stack.pop()];if(stack.isEmpty())break;int h =Math.min(height[stack.peek()], height[i])- h_pop;int w = i - stack.peek()-1;sum += h * w;}stack.push(i);}return sum;}}
84.柱状图中最大的矩形
classSolution{publicintlargestRectangleArea(int[] heights){Stack<Integer> stack =newStack<>();int[] newHeights =newint[heights.length +2];newHeights[0]=0;newHeights[newHeights.length -1]=0;for(int i =0; i < heights.length; i++)newHeights[i +1]= heights[i];heights = newHeights;int ans =0;stack.push(0);for(int i =1; i < heights.length; i++){while(heights[i]< heights[stack.peek()]){int mid = stack.pop();int left = stack.peek();int w = i - left -1;int h = heights[mid];ans =Math.max(ans, h * w);}stack.push(i);}return ans;}}