最大子方阵

题目描述

有一个方阵,其中每个单元(像素)非黑即白(非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] 最大子方阵的更多相关文章

  1. 51nod1787最大子方阵

    51nod1787最大子方阵 我在51nod上面切的第一道题 我在51nod上面切的第一道8级题 我在51nod上面切的第一道8级题的一血 题目大意 有一个n*m的矩阵,矩阵中的每一个元素是'X'或者 ...

  2. 2013 Multi-University Training Contest 2

    HDU-4611 Balls Rearrangement 题意:具体题意不大清楚,最后要处理一个这样的表达式:sum{ |i % a - i % b| },0 <= i < N 的取值很大 ...

  3. bzoj 1057 单调栈

    首先我们可以枚举每个一点,然后向下一直拓展到不能拓展为止,然后向下拓展的同时我们可以算出来向左最多拓展的个数,用单调栈来维护一个上升的序列,这样就类似与悬线法找最大01子矩阵了,但是对于这题01交替来 ...

  4. [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 ...

  5. [LeetCode] Maximum Product Subarray 求最大子数组乘积

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  6. [LeetCode] Maximum Subarray 最大子数组

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  7. 求一个数组的最大子数组(C/C++实现)

    最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...

  8. 在Eclipse中使用Junit进行单元测试练习 实现最大子数组和算法

    1.如何在MAC OS X下安装配置java开发工具 http://www.cnblogs.com/coderL/p/5939541.html 2.最大子数组和算法 附上程序运行及测试截图,源码见后 ...

  9. 洛谷P1101 单词方阵——S.B.S.

    题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red ...

随机推荐

  1. Java多线程之Semaphore信号量

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6557874.html  学过操作系统的对 信号量 这个词应该不陌生,它是用来进行进程间通信,控制对 临界区 ...

  2. Java ThreadLocal (Java代码实战-006)

    ThreadLocal解决什么问题 由于 ThreadLocal 支持范型,如 ThreadLocal< StringBuilder >,为表述方便,后文用 变量 代表 ThreadLoc ...

  3. 【Linux】使用cat命令创建文本文件

    在Linux界面输入 Linux:/usr/test # cat >test01.sh 接着按回车,输入内容:"echo hello world !" 回车后按 ctrl+d ...

  4. 如何查看2to3.PY的帮助文档

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #如何查看2to3.PY的帮助文档 #http://tieba.baidu.com/p/3939904893 ...

  5. windows下 jemalloc编译

    准备 Windows下使用VS2015进行编译,需要使用cmake构建版本.(如果有cygwin,在其中执行VS的vcvarsall.bat后使用"CC=cl ./autogen.sh&qu ...

  6. Jmeter-maven-plugin高级配置之选择测试脚本(转)

    Posted on 2014 年 6 月 6 日 在pom.xml文件中可以指定运行哪些jmx脚本. 运行所有的测试脚本 Jmeter默认运行${project.base.directory}/src ...

  7. java实现读取ftp服务器上的csv文件

    定义ftp操作接口 import java.io.InputStream; import java.util.List; import org.apache.commons.net.ftp.FTPCl ...

  8. 怎么样删除linux里带括号的文件?

    可以用 rm -i * 就是对每个删除都提示用户是否确定,这样在出现 (2).htaccess 的时候你回答y就可以了,其他回答n,当删除了 (2).htaccess这个文件之后,就可以用Ctrl+C ...

  9. ios中coredata

    http://blog.csdn.net/q199109106q/article/details/8563438 // // MJViewController.m // 数据存储5-Core Data ...

  10. 请问实现MVC的框架有哪些,实现持久化操作的框架有哪些,还有类似于spring整合的框架又有哪些

    2011-04-10 我知道MVC框架有struts.webWork; 持久化的有hibernate.ibatis,而进行整合的我只知道spring了 ------------------- 表示层框 ...