给定一个m×n矩阵,如果一个元素是0,则将其所在行和列全部元素变成0。
需要在原地完成。
样例
给出一个矩阵[[1,2],[0,3]],返回[[0,2],[0,0]]
挑战
你是否使用了额外的空间?
一个直接的解决方案是使用O(MN)的额外空间,但这并不是一个好的方案。
一个简单的改进方案是使用O(M + N)的额外空间,但这仍然不是最好的解决方案。
你能想出一个常数空间的解决方案吗?
分析:若点(i,j)为0,则可以把(i,0),(0,j)标记为0,最后根据该标记把列和行设置为0,这样的设置会影响第一行和第一列,所以第一行和第一列需要提前判断好。
代码:
class Solution { public: /** * @param matrix: A list of lists of integers * @return: Void */ void setZeroes(vector<vector<int> > &matrix) { // write your code here int n = matrix.size(); if(n==0) return ; int m = matrix[0].size(); bool firstLine = false; bool firstColumn = false; for(int i=0;i<n;i++) if(matrix[i][0]==0) firstColumn=true; for(int i=0;i<m;i++) if(matrix[0][i]==0) firstLine = true; for(int i=1;i<n;i++) { for(int j=1;j<m;j++) { if(matrix[i][j]==0) { matrix[i][0]=0; matrix[0][j]=0; } } } for(int i=1;i<n;i++) { if(matrix[i][0]==0) { for(int j=0;j<m;j++) matrix[i][j]=0; } } for(int i=1;i<m;i++) { if(matrix[0][i]==0) { for(int j=0;j<n;j++) matrix[j][i]=0; } } if(firstLine) for(int i=0;i<m;i++) matrix[0][i]=0; if(firstColumn) for(int i=0;i<n;i++) matrix[i][0]=0; } };
时间: 2024-11-08 22:15:37