您的位置:首页 > 编程语言 > C#

LeetCode Online Judge 题目C# 练习 - Maximal Rectangle

2012-09-25 05:30 423 查看
Given a 2D matrix fill with 0's and 1's, find the largest rectangle containing all ones and return its area.

public static int MaximalRectangle(List<List<char>> matrix)
{
int n = matrix.Count;
int m = matrix[0].Count;
int curr_area = 0;
int max_area = 0;

for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if(matrix[i][j] == '1')
{
int lastj = m;
for (int k = i; k < n && matrix[k][j] == '1'; k++)
{
for (int l = j; l < lastj; l++)
{
if (matrix[k][l] == '1')
{
curr_area = (l - j + 1) * (k - i + 1);
max_area = Math.Max(max_area, curr_area);
}
else
lastj = l;
}
}
}
}
}

return max_area;
}


代码分析:

  Brute Force, O(n4). 每一个是1的格子,都从上至下,从左往右,去看最大面积。lastj变量是存放最小的列。

  例如:  

1101
1011
1111
0011
  [0,0] : 第一行: curr_area: 2, max_area: 2, lastj = 2

      第二行: curr_area: 2, max_area: 2, lastj = 1

      第三行: curr_area: 3, max_area: 3, lastj = 1

      max_area = 3;

  ...

public static int MaximalRectangleOpt(List<List<char>> matrix)
{
int n = matrix.Count;
int m = matrix[0].Count;
int[,] dp = new int[n, m];
int curr_area = 0;
int max_area = 0;

for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (matrix[i][j] == '1')
dp[i, j] = j > 0 ? dp[i, j - 1] + 1 : 1;
else
dp[i, j] = 0;
}
}

for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
int k = i;
int min = dp[i, j];
while (k >= 0 && dp[k,j] > 0)
{
min = Math.Min(min, dp[k, j]);
curr_area = min * (i - k + 1);
max_area = Math.Max(max_area, curr_area);
k--;
}
}
}

return max_area;
}


代码分析:

  利用DP,第一次n2循环,先预处理。然后再O(n3)计算最大面积。

  例如:

1101
1011
1111
0011
  DP处理后生成新的2D- array

1201
1012
1234
0012
  每个格子相应的最大面积

1201
2012
3234
0036
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: