题目描述:
解题思路:简单题目,思路非常直接。对列进行遍历,记录下最大值,然后再遍历一遍,把-1替换为最大值。需要注意的是进行列遍历和行遍历是不同的。
官方题解:
class Solution {
public:vector<vector<int>> modifiedMatrix(vector<vector<int>>& matrix) {int n = matrix.size();int m = matrix[0].size();for (int j = 0; j < m; j++) {int zd = -1;for (int i = 0; i < n; i++) {zd = max(zd, matrix[i][j]);}for (int i = 0; i < n; i++) {if (matrix[i][j] == -1) {matrix[i][j] = zd;}}}return matrix;}
};
其实还可以进一步优化。官方题解对数据进行了两次遍历,有没有办法进行一次遍历呢?事实上可以把每一列的最大值和-1的元素坐标先保存下来,然后再把元素坐标替换为相应列的最大值即可。
这样只需要遍历一次数据就可以了。
class Solution {
public:// 存储坐标的结构体struct LOC{// 行坐标int row;// 列坐标int col;};
public:vector<vector<int>> modifiedMatrix(vector<vector<int>>& matrix) {// 获取行数int row = matrix.size();// 获取列数int col = matrix[0].size();// 没列最大值int max_value;// 存储每列最大值vector<int> max_vector;// 存储-1元素的坐标vector<LOC> loc_vector;// 按照列优先进行遍历for(int i=0;i<col; ++i){// 假设最大值为-2max_value = -2;for(int j=0;j<row;++j){if(max_value< matrix[j][i])max_value=matrix[j][i];if(matrix[j][i]==-1){LOC tmp_loc;tmp_loc.row = j;tmp_loc.col = i;loc_vector.push_back(tmp_loc);}}max_vector.push_back(max_value);}// 开始对-1的元素进行替换for(int i=0; i<loc_vector.size();++i){matrix[loc_vector[i].row][loc_vector[i].col]=max_vector[loc_vector[i].col];}return matrix;}
};
这是一条吃饭博客,由挨踢零声赞助。学C/C++就找挨踢零声,加入挨踢零声,面试不挨踢!