给定一个维度为M * N的矩阵 mat[][] ,任务是用其左或右对角线的最大和替换每个矩阵元素。
例子:
Input: mat[][] = {{5, 2, 1}, {7, 2, 6}, {3, 1, 9}}
Output:
16 9 6
9 16 8
6 8 16
Explanation:
Replace each element with max(sum of right diagonal, sum of left diagonal).
Follow the diagram below to understand more clearly.
Input: mat[][] = {{1, 2}, {3, 4}}
Output:
5 5
5 5
方法:主要思想基于以下观察的事实:
- 右对角线元素的行索引和列索引之和相等。
- 左对角元素的行索引和列索引之间的差值相等。
- 使用上面的两个属性,使用一个Map来存储每个元素左右对角线的总和。
- 遍历矩阵并用左对角线和或右对角线和的最大值替换每个元素。
- 打印得到的最终矩阵。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to update given matrix with
// maximum of left and right diagonal sum
void updateMatrix(int mat[][3])
{
// Stores the total sum
// of right diagonal
map right;
// Stores the total sum
// of left diagonal
map left;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
// Update the map storing
// right diagonal sums
if (right.find(i + j) == right.end())
right[i + j] = mat[i][j];
else
right[i + j] += mat[i][j];
// Update the map storing
// left diagonal sums
if (left.find(i - j) == left.end())
left[i - j] = mat[i][j];
else
left[i - j] += mat[i][j];
}
}
// Traverse the matrix
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
// Update the matrix
mat[i][j] = max(right[i + j], left[i - j]);
}
}
// Print the matrix
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << mat[i][j] << " ";
}
cout << endl;
}
}
// Driver code
int main()
{
int mat[][3]
= { { 5, 2, 1 }, { 7, 2, 6 }, { 3, 1, 9 } };
updateMatrix(mat);
return 0;
}
// This code is contributed by ukasp.
Python3
# Python3 program for the above approach
# Function to update given matrix with
# maximum of left and right diagonal sum
def updateMatrix(mat):
# Stores the total sum
# of right diagonal
right = {}
# Stores the total sum
# of left diagonal
left = {}
for i in range(len(mat)):
for j in range(len(mat[0])):
# Update the map storing
# right diagonal sums
if i + j not in right:
right[i + j] = mat[i][j]
else:
right[i + j] += mat[i][j]
# Update the map storing
# left diagonal sums
if i-j not in left:
left[i-j] = mat[i][j]
else:
left[i-j] += mat[i][j]
# Traverse the matrix
for i in range(len(mat)):
for j in range(len(mat[0])):
# Update the matrix
mat[i][j] = max(right[i + j], left[i-j])
# Print the matrix
for i in mat:
print(*i)
# Given matrix
mat = [[5, 2, 1], [7, 2, 6], [3, 1, 9]]
updateMatrix(mat)
输出:
16 9 6
9 16 8
6 8 16
时间复杂度: O(N * M)
辅助空间: O(N * M)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live