Problem: 3446. 按对角线进行矩阵排序
文章目录
- 思路
- 解题过程
- 复杂度
- Code
思路
发现每条对角线行号减列号是一个定值。
设k=i-j+n
,i=0,j=n-1时,k=1;i=m-1,j=0时,k=m+n-1。
解题过程
遍历对角线,找出最小和最大列,如果最小列大于零说明在矩阵右上角,升序排序,反之逆序排序。
复杂度
- 时间复杂度: O(n2logn)O(n^2logn)O(n2logn)
- 空间复杂度: O(n)O(n)O(n)
Code
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;}
};