[LeetCode] Set Matrix Zeroes (!!!!时间空间复杂度)
2015-08-27 14:40
393 查看
Set Matrix Zeroes
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
click to show follow up.
Follow up:
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
关键的问题是,当遇到A[i][j]等于0时,不能直接将第i行和第j列的元素都置为0,因为可能会影响到后面的元素,所以关键是下记录下ij的信息。
很容易想出的方法是,利用里一个行向量,一个列向量来存贮置位信息。这样空间复杂度就是O(m+n)
进一步进行优化,会返现上面发生干扰的问题只是干扰ij之后的元素,想不发生干扰,那么可以用第0行和第0列来代替上面的r[] c[]。第0行和第0列是否需要置零只需要两个临时变量即可。
牛逼啊~ ~
空间复杂度为o(1)时间复杂度为O(2mn)
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
click to show follow up.
Follow up:
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
关键的问题是,当遇到A[i][j]等于0时,不能直接将第i行和第j列的元素都置为0,因为可能会影响到后面的元素,所以关键是下记录下ij的信息。
很容易想出的方法是,利用里一个行向量,一个列向量来存贮置位信息。这样空间复杂度就是O(m+n)
void SetRow(int **A, int n, int ri){ for(int k = 0; k <n; ++k) A[ri][k]=0; } void SetCol(int **A, int m, int ci){ for(int k = 0; k<m; ++k) A[k][ci]=0; } void setZeroes(int** A, int m, int n) { int i,j; int *c = (int *)malloc(sizeof(int)*n); int *r = (int *)malloc(sizeof(int)*m); memset(r,1,m*sizeof(int)); memset(c,1,n*sizeof(int)); for(i = 0; i < m; ++i) for(j = 0; j <n; ++j) if(A[i][j]==0){ r[i]=0; c[j]=0; } for(i = 0; i <m; ++i) if(r[i]==0) SetRow(A,n,i); for(i = 0; i <n; ++i) if(c[i]==0) SetCol(A,m,i); }
进一步进行优化,会返现上面发生干扰的问题只是干扰ij之后的元素,想不发生干扰,那么可以用第0行和第0列来代替上面的r[] c[]。第0行和第0列是否需要置零只需要两个临时变量即可。
牛逼啊~ ~
void SetRow(int **A, int n, int ri){ for(int k = 0; k <n; ++k) A[ri][k]=0; } void SetCol(int **A, int m, int ci){ for(int k = 0; k<m; ++k) A[k][ci]=0; } void setZeroes(int** A, int m, int n) { int i,j; int r0=1,c0=1; for(j=0;j<n;++j) if(A[0][j]==0){ r0=0; break; } for(i=0;i<m;++i) if(A[i][0]==0){ c0=0; break; } for(i = 1; i < m; ++i) for(j = 1; j <n; ++j) if(A[i][j]==0){ A[i][0]=0; A[0][j]=0; } for(i = 1; i <m; ++i) if(A[i][0]==0) SetRow(A,n,i); for(i = 1; i <n; ++i) if(A[0][i]==0) SetCol(A,m,i); if(r0==0) SetRow(A,n,0); if(c0==0) SetCol(A,m,0); }
空间复杂度为o(1)时间复杂度为O(2mn)
相关文章推荐
- css3兼容性问题归纳
- POJ-3292-Semi-prime H-numbers -数学
- 图论进阶训练
- 彩信MMSpdu
- Coprime
- IMap.FeatureSelection方法获取Feature的属性信息
- 设计模式中的一些设计原则
- MySQL数据库从GBK转换到UTF-8最简单解决方案(也适用于其它编码转换)
- 源码搭建LAMP环境
- 黑马程序员--手机类的例子
- oracle job 时间的配置
- Android-多线程断点下载
- 我自己整理的一份reset.css的scss版 以作记录
- LCS模板
- 算法分类(写这个是为了让自己以后学算法的时候有针对性条理性)
- 公共字串计算
- 在linux下用tomcat部署java web项目的过程与注意事项
- 2013 Multi-University Training Contest 9(hdu 4686 - 4691)dp(好)+矩阵快速幂+一般图匹配带花树+后缀数组
- 安全终端模拟软件推荐
- java7 Fork/Join