[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 ...
随机推荐
- Java类中代码的执行顺序 静态代码块>构造代码块>构造方法
一:静态代码块 注意是代码块,不是静态函数.函数要调用才执行,代码块加载就执行,一般是静态变量的声明与初始化.被static修饰的代码块(赋值.输出操作等).类中静态语句块仅在类加载时被执行一次 如 ...
- 在 Vim 中使用 pydiction 对 Python 进行代码补全
Pydiction 允许你在 Vim 中实现 TAB 代码补全, 可以补全的内容包括:标准的.自定义的,以及第三方模块和包.外加关键字.BIFs,和字符串. Pydiction 由 3 个主要文件构成 ...
- 怎样使用Fiddler获取WebApi的token值?
User-Agent: Fiddler Host: localhost: Content-Length: Content-Type: application/json grant_type=passw ...
- 常见pip方法
pip search 包名 查询 pip install 包名 安装包 pip show--files 包名 pip list --outdated 检查哪些包需要更新 pip insta ...
- 链接sql数据库并输出csv文件
__author__ = 'chunyang.wu' #作者:SelectDB # -*- coding: utf-8 -*- import MySQLdb import os os.environ[ ...
- ios中layoutsubview何时被调用
layoutsubview和viewDidlayoutsubview(控制器)被调用的集中情况 一:当view的frame或bounds发生改变 1:直接改view的frame或bounds 会调用v ...
- Distributed systems theory for the distributed systems engineer
Gwen Shapira, SA superstar and now full-time engineer at Cloudera, asked a question on Twitter that ...
- 如何关闭Golang中的HTTP连接 How to Close Golang's HTTP connection
我们的一个服务是用Go写的,在测试的时候发现几个小时之后它就会core掉,而且core的时候没有打出任何堆栈信息,简单分析后发现该服务中的几个HTTP服务的连接数不断增长,而我们的开发机的fd lim ...
- Java进制转换, 数据类型, 运算符
1:进制转换 转换规则: 先把数据的每一位上的系数乘以对应基数的次幂(低位从零开始),然后相加即可 十进制到其他进制 规则:除基取余,直到商为0,最后将余数反转 十进制到二进制: 除2取余,直到商为0 ...
- 树莓派进阶之路 (008) - 树莓派安装ftp服务器(转)
vsftpd是开源的轻量级的常用ftp服务器. 1,安装vsftpd服务器 (约400KB) sudo apt-get install vsftpd 2,启动ftp服务 sudo serv ...