Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
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?
我的code如下:思路是,遍历2D-Array,遇到0元素,用2个HashSet<Integer>记录行列坐标。最后把标记的行列全部置零。
public class Solution {
public void setZeroes(int[][] matrix) {
int m=matrix.length;//【注意2】m:row
int n=matrix[0].length;//n:col
HashSet<Integer> hmi=new HashSet<Integer>();
HashSet<Integer> hmj=new HashSet<Integer>();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j]==0){
if(!hmi.contains(i))
hmi.add(i);
if(!hmj.contains(j))
hmj.add(j);
}
}
}
Iterator<Integer> iti=hmi.iterator();
while(iti.hasNext()){
int tempi=iti.next();
for(int k=0;k<n;k++){
matrix[tempi][k]=0;
}
}
Iterator<Integer> itj=hmj.iterator();
while(itj.hasNext()){
int tempj=itj.next();
for(int k=0;k<m;k++){
matrix[k][tempj]=0;
}
}
}
}
【注意1】第一次运行,出现如下Error
Runtime Error Message: Line 23: java.lang.ArrayIndexOutOfBoundsException: 1
Last executed input: [[1,0]]
原因是前半部分的for-for循环里的 j 不小心写成了 i ,看似无关的两部分,但如果不小心,这种错误很难发现,debug的位置也会找错。
【注意2】题目中没有给出m,n的值,至于如何获取,记住。2D-Array形式为[ [,,,],[,,,],[,,,],[,,,] ]
【后记1】我又试了用HashMap,用了如下代码片,编译失败了,回头再用HashMap重新实现一下:
HashMap<Integer,Integer> hmi=new HashMap<Integer,Integer>();
Iterator<Entry<Integer, Integer>> iti=hmi.entrySet().iterator();
while(iti.hasNext()){
int tempi=iti.getKey().next();
for(int j=0;j<n;j++){
matrix[tempi][j]=0;
}
}
【后记2】 时间复杂度 O(m*n),不能再优化了,因为每个元素都要遍历到。
空间复杂度是O(m+n),但是可以再优化到O(1)。思路来源于:http://blog.csdn.net/linhuanmars/article/details/24066199
“这道题也是cc150里面比较经典的题目,看似比较简单,却可以重重优化,最终达到常量空间。其实面试中面试官看重的是对于算法时间空间复杂度的理解,对优化的概念,这些常常比题目本身的难度更加重要,平常做题还是要对这些算法分析多考虑哈。”