int maximalRectangle(vector<vector<char>>& matrix) {
int rows = matrix.size(), cols = rows == 0 ? 0 : matrix[0].size();
int best = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (matrix[r][c] == '0') continue;
int minWidth = cols - c;
for (int r2 = r; r2 < rows && matrix[r2][c] == '1'; r2++) {
int w = 0;
while (c + w < cols && w < minWidth && matrix[r2][c + w] == '1') w++;
minWidth = min(minWidth, w);
best = max(best, minWidth * (r2 - r + 1));
}
}
}
return best;
}
public int maximalRectangle(char[][] matrix) {
int rows = matrix.length, cols = rows == 0 ? 0 : matrix[0].length;
int best = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (matrix[r][c] == '0') continue;
int minWidth = cols - c;
for (int r2 = r; r2 < rows && matrix[r2][c] == '1'; r2++) {
int w = 0;
while (c + w < cols && w < minWidth && matrix[r2][c + w] == '1') w++;
minWidth = Math.min(minWidth, w);
best = Math.max(best, minWidth * (r2 - r + 1));
}
}
}
return best;
}
def maximal_rectangle(matrix):
rows = len(matrix); cols = len(matrix[0]) if rows else 0
best = 0
for r in range(rows):
for c in range(cols):
if matrix[r][c] == '0': continue
min_width = cols - c
r2 = r
while r2 < rows and matrix[r2][c] == '1':
w = 0
while c + w < cols and w < min_width and matrix[r2][c + w] == '1': w += 1
min_width = min(min_width, w)
best = max(best, min_width * (r2 - r + 1))
r2 += 1
return best
function maximalRectangle(matrix: string[][]): number {
const rows = matrix.length, cols = rows === 0 ? 0 : matrix[0].length;
let best = 0;
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
if (matrix[r][c] === '0') continue;
let minWidth = cols - c;
for (let r2 = r; r2 < rows && matrix[r2][c] === '1'; r2++) {
let w = 0;
while (c + w < cols && w < minWidth && matrix[r2][c + w] === '1') w++;
minWidth = Math.min(minWidth, w);
best = Math.max(best, minWidth * (r2 - r + 1));
}
}
}
return best;
}
int maximalRectangle(vector<vector<char>>& matrix) {
int rows = matrix.size(), cols = rows == 0 ? 0 : matrix[0].size();
vector<int> heights(cols, 0);
int best = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) heights[c] = matrix[r][c] == '1' ? heights[c] + 1 : 0;
for (int left = 0; left < cols; left++) {
int minH = heights[left];
for (int right = left; right < cols && minH > 0; right++) {
minH = min(minH, heights[right]);
best = max(best, minH * (right - left + 1));
}
}
}
return best;
}
public int maximalRectangle(char[][] matrix) {
int rows = matrix.length, cols = rows == 0 ? 0 : matrix[0].length;
int[] heights = new int[cols];
int best = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) heights[c] = matrix[r][c] == '1' ? heights[c] + 1 : 0;
for (int left = 0; left < cols; left++) {
int minH = heights[left];
for (int right = left; right < cols && minH > 0; right++) {
minH = Math.min(minH, heights[right]);
best = Math.max(best, minH * (right - left + 1));
}
}
}
return best;
}
def maximal_rectangle(matrix):
rows = len(matrix); cols = len(matrix[0]) if rows else 0
heights = [0] * cols
best = 0
for r in range(rows):
for c in range(cols): heights[c] = heights[c] + 1 if matrix[r][c] == '1' else 0
for left in range(cols):
min_h = heights[left]
right = left
while right < cols and min_h > 0:
min_h = min(min_h, heights[right])
best = max(best, min_h * (right - left + 1))
right += 1
return best
function maximalRectangle(matrix: string[][]): number {
const rows = matrix.length, cols = rows === 0 ? 0 : matrix[0].length;
const heights = new Array<number>(cols).fill(0);
let best = 0;
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) heights[c] = matrix[r][c] === '1' ? heights[c] + 1 : 0;
for (let left = 0; left < cols; left++) {
let minH = heights[left];
for (let right = left; right < cols && minH > 0; right++) {
minH = Math.min(minH, heights[right]);
best = Math.max(best, minH * (right - left + 1));
}
}
}
return best;
}
int maximalRectangle(vector<vector<char>>& matrix) {
int rows = matrix.size();
if (rows == 0) return 0;
int cols = matrix[0].size();
vector<int> heights(cols + 1, 0);
int best = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) heights[c] = matrix[r][c] == '1' ? heights[c] + 1 : 0;
vector<int> stack;
for (int i = 0; i <= cols; i++) {
while (!stack.empty() && heights[stack.back()] >= heights[i]) {
int h = heights[stack.back()]; stack.pop_back();
int left = stack.empty() ? -1 : stack.back();
best = max(best, h * (i - left - 1));
}
stack.push_back(i);
}
}
return best;
}
public int maximalRectangle(char[][] matrix) {
int rows = matrix.length;
if (rows == 0) return 0;
int cols = matrix[0].length;
int[] heights = new int[cols + 1];
int best = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) heights[c] = matrix[r][c] == '1' ? heights[c] + 1 : 0;
Deque<Integer> stack = new ArrayDeque<>();
for (int i = 0; i <= cols; i++) {
while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
int h = heights[stack.pop()];
int left = stack.isEmpty() ? -1 : stack.peek();
best = Math.max(best, h * (i - left - 1));
}
stack.push(i);
}
}
return best;
}
def maximal_rectangle(matrix):
rows = len(matrix)
if rows == 0: return 0
cols = len(matrix[0])
heights = [0] * (cols + 1)
best = 0
for r in range(rows):
for c in range(cols): heights[c] = heights[c] + 1 if matrix[r][c] == '1' else 0
stack = []
for i in range(cols + 1):
while stack and heights[stack[-1]] >= heights[i]:
h = heights[stack.pop()]
left = stack[-1] if stack else -1
best = max(best, h * (i - left - 1))
stack.append(i)
return best
function maximalRectangle(matrix: string[][]): number {
const rows = matrix.length;
if (rows === 0) return 0;
const cols = matrix[0].length;
const heights = new Array<number>(cols + 1).fill(0);
let best = 0;
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) heights[c] = matrix[r][c] === '1' ? heights[c] + 1 : 0;
const stack: number[] = [];
for (let i = 0; i <= cols; i++) {
while (stack.length > 0 && heights[stack[stack.length - 1]] >= heights[i]) {
const h = heights[stack.pop()!];
const left = stack.length === 0 ? -1 : stack[stack.length - 1];
best = Math.max(best, h * (i - left - 1));
}
stack.push(i);
}
}
return best;
}
int maximalRectangle(vector<vector<char>>& matrix) {
int rows = matrix.size();
if (rows == 0 || matrix[0].empty()) return 0;
int cols = matrix[0].size();
vector<int> height(cols, 0);
vector<int> left(cols, 0);
vector<int> right(cols, cols);
int best = 0;
for (int r = 0; r < rows; r++) {
int curLeft = 0, curRight = cols;
for (int c = 0; c < cols; c++) height[c] = matrix[r][c] == '1' ? height[c] + 1 : 0;
for (int c = 0; c < cols; c++) {
if (matrix[r][c] == '1') left[c] = max(left[c], curLeft);
else { left[c] = 0; curLeft = c + 1; }
}
for (int c = cols - 1; c >= 0; c--) {
if (matrix[r][c] == '1') right[c] = min(right[c], curRight);
else { right[c] = cols; curRight = c; }
}
for (int c = 0; c < cols; c++) best = max(best, (right[c] - left[c]) * height[c]);
}
return best;
}
public int maximalRectangle(char[][] matrix) {
int rows = matrix.length;
if (rows == 0 || matrix[0].length == 0) return 0;
int cols = matrix[0].length;
int[] height = new int[cols];
int[] left = new int[cols];
int[] right = new int[cols]; Arrays.fill(right, cols);
int best = 0;
for (int r = 0; r < rows; r++) {
int curLeft = 0, curRight = cols;
for (int c = 0; c < cols; c++) height[c] = matrix[r][c] == '1' ? height[c] + 1 : 0;
for (int c = 0; c < cols; c++) {
if (matrix[r][c] == '1') left[c] = Math.max(left[c], curLeft);
else { left[c] = 0; curLeft = c + 1; }
}
for (int c = cols - 1; c >= 0; c--) {
if (matrix[r][c] == '1') right[c] = Math.min(right[c], curRight);
else { right[c] = cols; curRight = c; }
}
for (int c = 0; c < cols; c++) best = Math.max(best, (right[c] - left[c]) * height[c]);
}
return best;
}
def maximal_rectangle(matrix):
rows = len(matrix)
if rows == 0 or len(matrix[0]) == 0: return 0
cols = len(matrix[0])
height = [0] * cols
left = [0] * cols
right = [cols] * cols
best = 0
for r in range(rows):
cur_left, cur_right = 0, cols
for c in range(cols): height[c] = height[c] + 1 if matrix[r][c] == '1' else 0
for c in range(cols):
if matrix[r][c] == '1': left[c] = max(left[c], cur_left)
else: left[c] = 0; cur_left = c + 1
for c in range(cols - 1, -1, -1):
if matrix[r][c] == '1': right[c] = min(right[c], cur_right)
else: right[c] = cols; cur_right = c
for c in range(cols): best = max(best, (right[c] - left[c]) * height[c])
return best
function maximalRectangle(matrix: string[][]): number {
const rows = matrix.length;
if (rows === 0 || matrix[0].length === 0) return 0;
const cols = matrix[0].length;
const height = new Array<number>(cols).fill(0);
const left = new Array<number>(cols).fill(0);
const right = new Array<number>(cols).fill(cols);
let best = 0;
for (let r = 0; r < rows; r++) {
let curLeft = 0, curRight = cols;
for (let c = 0; c < cols; c++) height[c] = matrix[r][c] === '1' ? height[c] + 1 : 0;
for (let c = 0; c < cols; c++) {
if (matrix[r][c] === '1') left[c] = Math.max(left[c], curLeft);
else { left[c] = 0; curLeft = c + 1; }
}
for (let c = cols - 1; c >= 0; c--) {
if (matrix[r][c] === '1') right[c] = Math.min(right[c], curRight);
else { right[c] = cols; curRight = c; }
}
for (let c = 0; c < cols; c++) best = Math.max(best, (right[c] - left[c]) * height[c]);
}
return best;
}