题目描述:
解题思路:简单题目,思路非常直接。对列进行遍历,记录下最大值,然后再遍历一遍,把-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)
{
// 假设最大值为-2
max_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++就找挨踢零声,加入挨踢零声,面试不挨踢!