赞
踩
题目描述:
解题思路:简单题目,思路非常直接。对列进行遍历,记录下最大值,然后再遍历一遍,把-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++就找挨踢零声,加入挨踢零声,面试不挨踢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。