int largestRectangleArea(vector<int>& heights) {
int best = 0;
int n = heights.size();
for (int i = 0; i < n; i++) {
int l = i, r = i;
while (l > 0 && heights[l - 1] >= heights[i]) l--;
while (r < n - 1 && heights[r + 1] >= heights[i]) r++;
best = max(best, heights[i] * (r - l + 1));
}
return best;
}
public int largestRectangleArea(int[] heights) {
int best = 0;
int n = heights.length;
for (int i = 0; i < n; i++) {
int l = i, r = i;
while (l > 0 && heights[l - 1] >= heights[i]) l--;
while (r < n - 1 && heights[r + 1] >= heights[i]) r++;
best = Math.max(best, heights[i] * (r - l + 1));
}
return best;
}
def largest_rectangle_area(heights):
best = 0
n = len(heights)
for i in range(n):
l = r = i
while l > 0 and heights[l - 1] >= heights[i]: l -= 1
while r < n - 1 and heights[r + 1] >= heights[i]: r += 1
best = max(best, heights[i] * (r - l + 1))
return best
function largestRectangleArea(heights: number[]): number {
let best = 0;
for (let i = 0; i < heights.length; i++) {
let l = i, r = i;
while (l > 0 && heights[l - 1] >= heights[i]) l--;
while (r < heights.length - 1 && heights[r + 1] >= heights[i]) r++;
best = Math.max(best, heights[i] * (r - l + 1));
}
return best;
}
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
vector<int> leftLess(n), rightLess(n);
vector<int> stack;
for (int i = 0; i < n; i++) {
while (!stack.empty() && heights[stack.back()] >= heights[i]) stack.pop_back();
leftLess[i] = stack.empty() ? -1 : stack.back();
stack.push_back(i);
}
stack.clear();
for (int i = n - 1; i >= 0; i--) {
while (!stack.empty() && heights[stack.back()] >= heights[i]) stack.pop_back();
rightLess[i] = stack.empty() ? n : stack.back();
stack.push_back(i);
}
int best = 0;
for (int i = 0; i < n; i++) best = max(best, heights[i] * (rightLess[i] - leftLess[i] - 1));
return best;
}
public int largestRectangleArea(int[] heights) {
int n = heights.length;
int[] leftLess = new int[n], rightLess = new int[n];
Deque<Integer> stack = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) stack.pop();
leftLess[i] = stack.isEmpty() ? -1 : stack.peek();
stack.push(i);
}
stack.clear();
for (int i = n - 1; i >= 0; i--) {
while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) stack.pop();
rightLess[i] = stack.isEmpty() ? n : stack.peek();
stack.push(i);
}
int best = 0;
for (int i = 0; i < n; i++) best = Math.max(best, heights[i] * (rightLess[i] - leftLess[i] - 1));
return best;
}
def largest_rectangle_area(heights):
n = len(heights)
left_less = [0] * n; right_less = [0] * n
stack = []
for i in range(n):
while stack and heights[stack[-1]] >= heights[i]: stack.pop()
left_less[i] = -1 if not stack else stack[-1]
stack.append(i)
stack.clear()
for i in range(n - 1, -1, -1):
while stack and heights[stack[-1]] >= heights[i]: stack.pop()
right_less[i] = n if not stack else stack[-1]
stack.append(i)
best = 0
for i in range(n): best = max(best, heights[i] * (right_less[i] - left_less[i] - 1))
return best
function largestRectangleArea(heights: number[]): number {
const n = heights.length;
const leftLess = new Array<number>(n), rightLess = new Array<number>(n);
const stack: number[] = [];
for (let i = 0; i < n; i++) {
while (stack.length > 0 && heights[stack[stack.length - 1]] >= heights[i]) stack.pop();
leftLess[i] = stack.length === 0 ? -1 : stack[stack.length - 1];
stack.push(i);
}
stack.length = 0;
for (let i = n - 1; i >= 0; i--) {
while (stack.length > 0 && heights[stack[stack.length - 1]] >= heights[i]) stack.pop();
rightLess[i] = stack.length === 0 ? n : stack[stack.length - 1];
stack.push(i);
}
let best = 0;
for (let i = 0; i < n; i++) best = Math.max(best, heights[i] * (rightLess[i] - leftLess[i] - 1));
return best;
}
int largestRectangleArea(vector<int>& heights) {
vector<int> stack;
int best = 0;
int n = heights.size();
for (int i = 0; i <= n; i++) {
int h = (i == n) ? 0 : heights[i];
while (!stack.empty() && heights[stack.back()] >= h) {
int height = heights[stack.back()]; stack.pop_back();
int left = stack.empty() ? -1 : stack.back();
best = max(best, height * (i - left - 1));
}
stack.push_back(i);
}
return best;
}
public int largestRectangleArea(int[] heights) {
Deque<Integer> stack = new ArrayDeque<>();
int best = 0;
int n = heights.length;
for (int i = 0; i <= n; i++) {
int h = (i == n) ? 0 : heights[i];
while (!stack.isEmpty() && heights[stack.peek()] >= h) {
int height = heights[stack.pop()];
int left = stack.isEmpty() ? -1 : stack.peek();
best = Math.max(best, height * (i - left - 1));
}
stack.push(i);
}
return best;
}
def largest_rectangle_area(heights):
stack = []
best = 0
n = len(heights)
for i in range(n + 1):
h = 0 if i == n else heights[i]
while stack and heights[stack[-1]] >= h:
height = heights[stack.pop()]
left = stack[-1] if stack else -1
best = max(best, height * (i - left - 1))
stack.append(i)
return best
function largestRectangleArea(heights: number[]): number {
const stack: number[] = [];
let best = 0;
for (let i = 0; i <= heights.length; i++) {
const h = i === heights.length ? 0 : heights[i];
while (stack.length > 0 && heights[stack[stack.length - 1]] >= h) {
const height = heights[stack.pop()!];
const left = stack.length === 0 ? -1 : stack[stack.length - 1];
best = Math.max(best, height * (i - left - 1));
}
stack.push(i);
}
return best;
}
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
if (n == 0) return 0;
vector<int> stack(n + 1);
int top = 0;
long long best = 0;
for (int i = 0; i <= n; i++) {
int h = (i == n) ? 0 : heights[i];
while (top > 0 && heights[stack[top - 1]] >= h) {
int height = heights[stack[--top]];
int left = (top == 0) ? -1 : stack[top - 1];
best = max(best, (long long)height * (i - left - 1));
}
stack[top++] = i;
}
return (int)best;
}
public int largestRectangleArea(int[] heights) {
int n = heights.length;
if (n == 0) return 0;
int[] stack = new int[n + 1];
int top = 0;
long best = 0;
for (int i = 0; i <= n; i++) {
int h = (i == n) ? 0 : heights[i];
while (top > 0 && heights[stack[top - 1]] >= h) {
int height = heights[stack[--top]];
int left = (top == 0) ? -1 : stack[top - 1];
best = Math.max(best, (long) height * (i - left - 1));
}
stack[top++] = i;
}
return (int) best;
}
def largest_rectangle_area(heights):
n = len(heights)
if n == 0: return 0
stack = [0] * (n + 1)
top = 0
best = 0
for i in range(n + 1):
h = 0 if i == n else heights[i]
while top > 0 and heights[stack[top - 1]] >= h:
top -= 1
height = heights[stack[top]]
left = -1 if top == 0 else stack[top - 1]
best = max(best, height * (i - left - 1))
stack[top] = i; top += 1
return best
function largestRectangleArea(heights: number[]): number {
const n = heights.length;
if (n === 0) return 0;
const stack = new Int32Array(n + 1);
let top = 0;
let best = 0;
for (let i = 0; i <= n; i++) {
const h = i === n ? 0 : heights[i];
while (top > 0 && heights[stack[top - 1]] >= h) {
const height = heights[stack[--top]];
const left = top === 0 ? -1 : stack[top - 1];
best = Math.max(best, height * (i - left - 1));
}
stack[top++] = i;
}
return best;
}