给定一个整数的2D向量mat [] [] 。任务是按从左上到右下的对角线对矢量的元素进行递增排序。
例子:
Input: mat[][] =
{{9, 4, 2},
{7, 4, 6},
{2, 3, 3}}
Output:
3 4 2
3 4 6
2 7 9
Explanation:
There are 5 diagonals in this matrix:
1. {2} - No need to sort
2. {7, 3} - Sort - {3, 7}
3. {9, 4, 3} - Sort - {3, 4, 9}
4. {4, 6} - Already sorted
5. {2} - No need to sort
Input: mat[][] =
{{ 4, 3, 2, 1 },
{ 3, 2, 1, 0 },
{ 2, 1, 1, 0 },
{ 0, 1, 2, 3 }}
Output:
1 0 0 1
1 2 1 2
1 2 3 3
0 2 3 4
方法:
- 同一对角线中的所有元素都具有相同的索引差i – j ,其中i是行号,j是列号。因此,我们可以使用地图将每个对角线存储在索引i – j处。
- 现在我们可以使用内置函数对地图的每个索引进行排序。
- 现在,在原始矩阵中,我们可以插入存储在map中的矩阵的每个对角线。
- 最后,我们可以打印矩阵。
下面是上述方法的实现:
CPP
// C++ implementation to sort the
// diagonals of the matrix
#include
using namespace std;
// Function to sort the
// diagonal of the matrix
void SortDiagonal(int mat[4][4],
int m, int n)
{
// Map to store every diagonal
// in different indices here
// elements of same diagonal
// will be stored in same index
unordered_map > mp;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
// Storing diagonal elements
// in map
mp[i - j].push_back(mat[i][j]);
}
}
// To sort each diagonal in
// ascending order
for (int k = -(n - 1); k < m; k++)
{
sort(mp[k].begin(),
mp[k].end());
}
// Loop to store every diagonal
// in ascending order
for (int i = m - 1; i >= 0; i--)
{
for (int j = n - 1; j >= 0; j--)
{
mat[i][j] = mp[i - j].back();
mp[i - j].pop_back();
}
}
// Loop to print the matrix
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
cout << mat[i][j] << " ";
cout << endl;
}
}
// Driven Code
int main()
{
int arr[4][4] = { { 4, 3, 2, 1 },
{ 3, 2, 1, 0 },
{ 2, 1, 1, 0 },
{ 0, 1, 2, 3 } };
// Sort the Diagonals
SortDiagonal(arr, 4, 4);
return 0;
}
输出:
1 0 0 1
1 2 1 2
1 2 3 3
0 2 3 4