题目描述
给你一个下标从 0 开始、大小为 m x n 的整数矩阵 matrix ,新建一个下标从 0 开始、名为 answer 的矩阵。使 answer 与 matrix 相等,接着将其中每个值为 -1 的元素替换为所在列的 最大 元素。
返回矩阵 answer 。
3033.修改矩阵
测试案例及提示
示例 1:
输入:matrix = [[1,2,-1],[4,-1,6],[7,8,9]]
输出:[[1,2,9],[4,8,6],[7,8,9]]
解释:
将单元格 [1][1] 中的值替换为列 1 中的最大值 8 。
将单元格 [0][2] 中的值替换为列 2 中的最大值 9 。
示例 2:
输入:matrix = [[3,-1],[5,2]]
输出:[[3,2],[5,2]]
提示:
m == matrix.length
n == matrix[i].length
2 <= m, n <= 50
-1 <= matrix[i][j] <= 100
测试用例中生成的输入满足每列至少包含一个非负整数。
解题思路
整体思路:遍历一次matrix,如果是-1就把这一列最大的元素加入结果数组,否则就直接加入。那么如何求每一列的最大值就是一个问题了,这里可以考虑两种方式,一种是python中的zip()函数,可以对列表进行转置,然后获取最大值。另一种是常规的遍历,但需要先遍历列再遍历行。
Python代码实现:
class Solution:
def modifiedMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
h = len(matrix) # 行
l = len(matrix[0]) # 列
ans = [[None for _ in range(l)] for _ in range(h)] # 目标数组
tran_matrix = zip(*matrix)
max_nums = [max(column) for column in tran_matrix]
for i,row in enumerate(matrix):
for j, element in enumerate(row):
if element == -1:
ans[i][j] = max_nums[j]
else:
ans[i][j] = element
return ans
Java代码实现:
class Solution {
public int[][] modifiedMatrix(int[][] matrix) {
int h = matrix.length;
int l = matrix[0].length;
int[][] ans = new int[h][l];
for (int j = 0; j < l; j++) {
int max_num = -1;
for (int i = 0; i < h; i++) {
if (matrix[i][j] > max_num) {
max_num = matrix[i][j];
}
}
for (int i = 0; i < h; i++) {
ans[i][j] = matrix[i][j] == -1 ? max_num : matrix[i][j];
}
}
return ans;
}
}
小声bb:Python什么都好,就是不用Numpy的话创建二维数组不直观,不方便。