class Solution { public static int MAXN = 100001; public static int[] statck = new int[MAXN]; public static int r; public int[] dailyTemperatures(int[] nums) { int n = nums.length; int[] ans = new int[n]; r = 0; for(int i = 0,cur;i < n;i++){ //r>0限制栈中仍有元素 while(r > 0 && nums[statck[r-1]] < nums[i]){ cur = statck[--r]; ans[cur] = i - cur; } statck[r++] = i; } return ans; } }
class Solution { public static int MOD = 1000000007; public static int MAXN = 30001; public static int[] stack = new int[MAXN]; public static int r; public int sumSubarrayMins(int[] arr) { r = 0; int left; long ans = 0; for(int i = 0,cur;i < arr.length;i++){ while(r > 0 && arr[stack[r-1]] >= arr[i]){ cur = stack[--r]; left = r == 0 ? -1 :stack[r-1]; //(long)(cur - left)使得后续运算都在long环境下执行 //(ans+当前答案)%mod,防止ans过大,加上当前答案超过MOD ans = (ans + (long)(cur - left)*(i - cur) * arr[cur])%MOD; } stack[r++] = i; } while(r > 0){ int cur = stack[--r]; left = r == 0 ? -1 :stack[r-1]; ans = (ans + (long)(cur - left)*(arr.length - cur) * arr[cur])%MOD; } return (int)ans; } }
class Solution { public static int MAXN = 100001; public static int[] stack = new int[MAXN]; public static int r; public int largestRectangleArea(int[] heights) { r = 0; int ans = 0; int cur,left; for(int i = 0;i < heights.length;i++){ while(r > 0 && heights[stack[r-1]] >= heights[i]){ cur = stack[--r]; left = r == 0 ? -1 : stack[r-1]; ans = Math.max(ans,(i - left - 1)*heights[cur]); } stack[r++] = i; } while(r > 0){ cur = stack[--r]; left = r == 0 ? -1 : stack[r-1]; ans = Math.max(ans,(heights.length - left - 1)*heights[cur]); } return ans; } }
class Solution { public static int MAXN = 201; public static int[] height = new int[MAXN]; public static int[] statck = new int[MAXN]; public static int r; public int maximalRectangle(char[][] matrix) { int n = matrix.length; int m = matrix[0].length; int ans = 0; Arrays.fill(height, 0, m, 0); for (int i = 0; i < n; i++) { // 来到i行,长方形一定要以i行做底! // 加工高度数组(压缩数组) for (int j = 0; j < m; j++) { height[j] = matrix[i][j] == '0' ? 0 : height[j] + 1; } ans = Math.max(ans, largestRectangleArea(m)); } return ans; } public static int largestRectangleArea(int m) { r = 0; int ans = 0; int cur, left; for (int i = 0; i < m; i++) { while (r > 0 && height[statck[r - 1]] >= height[i]) { cur = statck[--r]; left = r == 0 ? -1 : statck[r - 1]; ans = Math.max(ans, (i - left - 1) * height[cur]); } statck[r++] = i; } while (r > 0) { cur = statck[--r]; left = r == 0 ? -1 : statck[r - 1]; ans = Math.max(ans, (m - left - 1) * height[cur]); } return ans; } }