[CTCI] 最大子方阵
题目描述
有一个方阵,其中每个单元(像素)非黑即白(非0即1),请设计一个高效算法,找到四条边颜色相同的最大子方阵。
给定一个01方阵mat,同时给定方阵的边长n,请返回最大子方阵的边长。保证方阵变长小于等于100。
[[1,1,1],[1,0,1],[1,1,1]],3
返回:3
要看清题目,题目说的是四条边同一种颜色,不是四条边都是1。想法就是记录每个点右侧与下侧的连续0或1的个数,这样在给定一个左上角坐标与边长时,可以以O(1)的时间判断是否构成矩形。总的时候复杂度为O(N^3)。
class SubMatrix {
public:
struct cell {
int right, down;
cell() : right(), down(){}
};
int maxSubMatrix(vector<vector<int> > mat, int n) {
// write code here
vector<vector<cell>> mmat1(n, vector<cell>(n));
vector<vector<cell>> mmat2(n, vector<cell>(n));
int tmp1, tmp2, res;
for (int i = n - ; i >= ; --i) {
for (int j = n - ; j >= ; --j) {
if (j == n - ) tmp1 = tmp2 = ;
else tmp1 = mmat1[i][j+].right, tmp2 = mmat2[i][j+].right;
if (mat[i][j] == ) mmat1[i][j].right = tmp1 + ;
else mmat2[i][j].right = tmp2 + ;
if (i == n - ) tmp1 = tmp2 = ;
else tmp1 = mmat1[i+][j].down, tmp2 = mmat2[i+][j].down;
if (mat[i][j] == ) mmat1[i][j].down = tmp1 + ;
else mmat2[i][j].down = tmp2 + ;
}
}
for (int i = n; i > ; --i) {
if (isOK(mmat1, n, i) || isOK(mmat2, n, i)) return i;
}
return ;
}
bool isOK(vector<vector<cell>> &mat, int n, int size) {
for (int i = ; i <= n - size; ++i) {
for (int j = ; j <= n - size; ++j) {
if (isSquare(mat, i, j, size)) return true;
}
}
return false;
}
bool isSquare(vector<vector<cell>> &mat, int x, int y, int size) {
cell &lefttop = mat[x][y], &leftdown = mat[x+size-][y], &righttop = mat[x][y+size-];
if (lefttop.right < size) return false;
if (lefttop.down < size) return false;
if (leftdown.right < size) return false;
if (righttop.down < size) return false;
return true;
}
};
[CTCI] 最大子方阵的更多相关文章
- 51nod1787最大子方阵
51nod1787最大子方阵 我在51nod上面切的第一道题 我在51nod上面切的第一道8级题 我在51nod上面切的第一道8级题的一血 题目大意 有一个n*m的矩阵,矩阵中的每一个元素是'X'或者 ...
- 2013 Multi-University Training Contest 2
HDU-4611 Balls Rearrangement 题意:具体题意不大清楚,最后要处理一个这样的表达式:sum{ |i % a - i % b| },0 <= i < N 的取值很大 ...
- bzoj 1057 单调栈
首先我们可以枚举每个一点,然后向下一直拓展到不能拓展为止,然后向下拓展的同时我们可以算出来向左最多拓展的个数,用单调栈来维护一个上升的序列,这样就类似与悬线法找最大01子矩阵了,但是对于这题01交替来 ...
- [LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [LeetCode] Maximum Subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 求一个数组的最大子数组(C/C++实现)
最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...
- 在Eclipse中使用Junit进行单元测试练习 实现最大子数组和算法
1.如何在MAC OS X下安装配置java开发工具 http://www.cnblogs.com/coderL/p/5939541.html 2.最大子数组和算法 附上程序运行及测试截图,源码见后 ...
- 洛谷P1101 单词方阵——S.B.S.
题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red ...
随机推荐
- 《Cocos2d-JS 开发之旅》即将发行,Cocos2d-x联合创始人林顺作序力荐
受电子工业出版社邀请,经过半年多的酝酿,<Cocos2d-JS 开发之旅>(作者:郑高强)已经出版了,本书详细讲述如何使用Cocos2d-JS制作HTML5游戏和原生手机游戏,另外还有部分 ...
- 小贝_mysql 触发器使用
触发器 简要 1.触发器基本概念 2.触发器语法及实战样例 3.before和after差别 一.触发器基本概念 1.一触即发 2.作用: 监视某种情况并触发某种操作 3.观察场景 一个电子商城: 商 ...
- excel 上标和下标
开始--字体--设置单元格格式--上标/下标
- https知识了解与javaweb中如何使用https
1) https是什么? https是一种协议,在说https之前我们先说一下什么是http,http就是我们平时浏览网页时使用的一种协议,https协议传输的数据都是未加密的,也就是明文的 ...
- Tensorflow异常集锦
一.tensorflow checkpoint报错 在调用tf.train.Saver#save时,如果使用的路径是绝对路径,那么保存的checkpoint里面用的就是绝对路径:如果使用的是相对路径, ...
- Android开发环境——调试器 DDMS相关内容汇总
Android开发环境将分为SDK相关内容.Eclipse ADT相关内容.模拟器AVD相关内容.调试器DDMS相关内容.日志LogCat相关内容.连接驱动ADB相关内容.内存泄露检测工具MAT ...
- Tensorflow CNN入门
一.概论 以图像识别来举例,比如我们让计算机如何识别一张猫的图片识别出猫呢? 老式的计算机视觉是如何做的呢? 比如OpenCV: 首先理解很多算法,比如如何检测线条(Edge Detection) 如 ...
- Entity Framework之深入分析
EF虽然是一个晚生畸形的ORM框架,但功能强大又具有灵活性的,给了开发人员一定的发挥空间.因为微软出发点总是好的,让开发变得简单,但实际上不是所有的事情都这么理想.这里顺便推荐马丁大叔的书<企业 ...
- 【Android】Android连接SQLite3数据库的操作
在前面使用SQLite3的时候,并没有留意到有SQLiteOpenHelper这个类,所以只好在Activity里面去创建和维护数据库跟数据表的创建. 但是,现在有了SQLiteOpenHelper这 ...
- Docker : endpoint with name xxx already exists.
停止不了容器,在尝试过: docker stop [container_id] docker kill [container_id] 都不行之后,强制删除容器: docker rm -f [cont ...