首页 > 代码库 > LeetCode Maximal Rectangle
LeetCode Maximal Rectangle
class Solution { public: int maximalRectangle(vector<vector<char> > &matrix) { int rows = matrix.size(); if (rows == 0) return 0; int cols = matrix[0].size(); if (cols == 0) return 0; cols++; int* memo = new int[cols * cols]; for (int i=cols * cols - 1; i>=0; i--) memo[i] = 0; for (int i=1; i<cols; i++) memo[i * cols + i - 1] = 1; int max_rect = 0; for (int i=0; i<rows; i++) { vector<char>& row = matrix[i]; for (int j = 1; j<cols; j++) { int base = j * cols; for (int k = j; k<cols; k++) { if (row[k - 1] == ‘1‘ && memo[base + k - 1] > 0) { int cur_rect = ++memo[base + k] * (k - j + 1); if (cur_rect > max_rect) max_rect = cur_rect; } else { memo[base + k] = 0; } } } } delete[] memo; return max_rect; } };
O(n^3)暴力,用一个memo数组记录各个区段上的高度(memo[i+1][j+1]表示扫描到matrix中某一行时,该行[x_row][i...j]区间内的最低高度),用时250+ms,按照leetcode的一般时间范围,肯定有巧妙的解法,去zhuli哥看了一下,结合做max rectangular area in histogram那题可以把时间降到O(n^2),用时70+ms,缺乏灵活运用能力啊!下面给出代码
int maximalRectangle(vector<vector<char> > &matrix) { int rows = matrix.size(); if (rows == 0) return 0; int cols = matrix[0].size(); if (cols == 0) return 0; vector<int> height(cols, 0); vector<int> L, R; L.resize(cols), R.resize(cols); int max_rect = 0; for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { height[j] = matrix[i][j] == ‘1‘ ? height[j] + 1 : 0; } for (int j=0; j<cols; j++) { L[j] = j; while (L[j] - 1 >= 0 && height[L[j] - 1] >= height[j]) { L[j] = L[L[j] - 1]; } } for (int j=cols-1; j>=0; j--) { R[j] = j; while (R[j] + 1 < cols && height[R[j] + 1] >= height[j]) { R[j] = R[R[j] + 1]; } } for (int j=0; j<cols; j++) { int rect = (R[j] - L[j] + 1) * height[j]; if (rect > max_rect) max_rect = rect; } } return max_rect; }
参考:
http://www.cnblogs.com/zhuli19901106/p/3570175.html
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。