Problem: 3446. 按对角线进行矩阵排序
文章目录
思路
发现每条对角线行号减列号是一个定值。
设
k=i-j+n
,i=0,j=n-1时,k=1;i=m-1,j=0时,k=m+n-1。
解题过程
遍历对角线,找出最小和最大列,如果最小列大于零说明在矩阵右上角,升序排序,反之逆序排序。
复杂度
- 时间复杂度: O ( n 2 l o g n ) O(n^2logn) O(n2logn)
- 空间复杂度: O ( n ) O(n) O(n)
Code
cpp
class Solution {
public:
vector<vector<int>> sortMatrix(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
for (int k = 1; k < m + n; k++) {
int minj = max(n - k, 0);
int maxj = min(m + n - 1 - k, n - 1);
vector<int> temp;
for (int j = minj; j <= maxj; j++) {
temp.push_back(grid[k + j - n][j]);
}
if (minj > 0) {
ranges::sort(temp);
} else {
ranges::sort(temp, greater<int>());
}
for (int j = minj; j <= maxj; j++) {
grid[k + j - n][j] = temp[j - minj];
}
}
return grid;
}
};