题目:
解答:
常量空间的话,第一可以考虑是不是固定数量的几个变量能搞定;否则可以考虑是不是问题本身已经提供了足够的空间。
这道题目属于后者,就是利用矩阵的第一行和第一列来作为辅助空间使用。不用开辟新的存储空间。方法就是:
A. 先确定第一行和第一列是否需要清零;
B. 扫描剩下的矩阵元素,如果遇到了0,就将对应的第一行和第一列上的元素赋值为0;
C. 根据第一行和第一列的信息,已经可以将剩下的矩阵元素赋值为结果所需的值了;
D. 根据1中确定的状态,处理第一行和第一列;
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int rows = matrix.size(); if(0 == rows) { return; } int cols = matrix[0].size(); if(0 == cols) { return; } //using first row and col as storage //1.search zero in first row and col to determin it‘s own status bool zerorow0 = false; bool zerocol0 = false; for(int ci = 0; ci < cols; ++ci) { if(matrix[0][ci] == 0) { zerorow0 = true; break; } } for(int ri = 0; ri < rows; ++ri) { if(matrix[ri][0] == 0) { zerocol0 = true; break; } } //2.search zeros in other position to sign the first row and col for(int ri = 1; ri < rows; ++ri) { for(int ci = 1; ci < cols; ++ci) { if(matrix[ri][ci] == 0) { matrix[0][ci] = 0; matrix[ri][0] = 0; } } } //3.set zeroes in other positions according to first col and row for(int ri = 1; ri < rows; ++ri) { for(int ci = 1; ci < cols; ++ci) { if(matrix[0][ci] == 0 || matrix[ri][0] == 0) { matrix[ri][ci] = 0; } } } //4.set zeroes for first row and col if(zerorow0) { for(int ci = 0; ci < cols; ++ci) { matrix[0][ci] = 0; } } if(zerocol0) { for(int ri = 0; ri < rows; ++ri) { matrix[ri][0] = 0; } } } };
原文:https://www.cnblogs.com/ocpc/p/12861021.html