3446. 按对角线进行矩阵排序
题目链接:3446. 按对角线进行矩阵排序
代码如下:
cpp
class Solution {
public:
vector<vector<int>> sortMatrix(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
//第一排在右上,最后一排在右下
//每排从左上到右下
//令k=i-j+n,那么右上角k=1,左下角k=m+n-1
for (int k = 1;k < m + n;k++) {
//核心:计算j的最大值和最小值
int min_j = max(n - k, 0);//i=0的时候,j=n-k,但不能是负数
int max_j = min(m + n - 1 - k, n - 1);//i=m-1的时候,j=m+n-1-k,但不能超过n-1
vector<int> a;
for (int j = min_j;j <= max_j;j++) {
a.push_back(grid[k + j - n][j]);//根据k的
}
if (min_j > 0) {
ranges::sort(a);
}
else {
ranges::sort(a, greater<int>());
}
for (int j = min_j;j <= max_j;j++) {
grid[k + j - n][j] = a[j - min_j];
}
}
return grid;
}
};