zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

1329. 将矩阵按对角线排序

2023-02-18 16:34:56 时间

1329. 将矩阵按对角线排序

给你一个 m * n 的整数矩阵 mat ,请你将同一条对角线上的元素(从左上到右下)按升序排序后,返回排好序的矩阵。

示例 1:

 

输入:mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
输出:[[1,1,1,1],[1,2,2,2],[1,2,3,3]]

利用左对角线元素 坐标 i-j 相等的特性(右对角线元素 i+j 相等)
把同一斜边的元素放到一个数组里排序

class Solution {
public:
    vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {
        int n = mat.size(), m = mat[0].size();
        unordered_map<int, vector<int>> vs;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j)
                vs[i - j].emplace_back(mat[i][j]);
        }
        for (auto& v : vs) sort(v.second.rbegin(), v.second.rend());

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                mat[i][j] = vs[i - j].back();
                vs[i - j].pop_back();
            }
        }
        return mat;
    }
};

 

class Solution {
public:
    vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {
        if(mat.empty()) return mat;
        for(int i = 0; i < mat.size(); i++){
            vector<int> tmp;
            getValue(mat, tmp, i, 0);
            sort(tmp.begin(), tmp.end());
            setValue(mat, tmp, i, 0);
        }

        for(int j = 1; j < mat[0].size(); j++) {
            vector<int> tmp;
            getValue(mat, tmp, 0, j);
            sort(tmp.begin(), tmp.end());
            setValue(mat, tmp, 0, j);
        }
        return mat;
    }

    void getValue(vector<vector<int>>& m, vector<int>& value, int i, int j){
        int rows = m.size(), cols = m[0].size();
        while(i < rows && j < cols){
            value.push_back(m[i++][j++]);
        }
    }

    void setValue(vector<vector<int>>& m, vector<int>& value, int i, int j){
        int rows = m.size(), cols = m[0].size();
        int k = 0;
        while(i < rows && j < cols){
            m[i++][j++] = value[k++];
        }
    }
};