3446. 按对角线进行矩阵排序

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;
    }
};
相关推荐
wschichi1 个月前
2683. 相邻值的按位异或
leetcode每日一题