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++];
}
}
};