Input: grid =[[1,7,3],[9,8,2],[4,5,6]]Output: [[8,2,3],[9,6,7],[4,5,1]]Explanation:
The diagonals with a black arrow(bottom-left triangle) should be sorted in non-increasing order:*`[1, 8, 6]` becomes `[8, 6, 1]`.*`[9, 5]` and `[4]` remain unchanged.The diagonals with a blue arrow(top-right triangle) should be sorted in non-decreasing order:*`[7, 2]` becomes `[2, 7]`.*`[3]` remains unchanged.
Input: grid =[[0,1],[1,2]]Output: [[2,1],[1,0]]Explanation:
The diagonals with a black arrow must be non-increasing, so `[0, 2]`is changed to `[2, 0]`. The other diagonals are already in the correct order.
We need to identify diagonals and sort them based on their position. Diagonals can be identified by the difference i - j. For diagonals where i - j >= 0 (bottom-left triangle including main diagonal), sort in non-increasing order. For diagonals where i - j < 0 (top-right triangle), sort in non-decreasing order.
#include<vector>#include<algorithm>#include<map>usingnamespace std;
vector<vector<int>> sortMatrix(vector<vector<int>>& grid) {
int n = grid.size();
map<int, vector<int>> diagonals;
// Group elements by diagonal (i - j)
for (int i =0; i < n; i++) {
for (int j =0; j < n; j++) {
diagonals[i - j].push_back(grid[i][j]);
}
}
// Sort each diagonal
for (auto& [diag, elements] : diagonals) {
if (diag >=0) {
// Bottom-left triangle (including main diagonal): non-increasing
sort(elements.begin(), elements.end(), greater<int>());
} else {
// Top-right triangle: non-decreasing
sort(elements.begin(), elements.end());
}
}
// Place sorted elements back
vector<vector<int>> result(n, vector<int>(n));
map<int, int> indices; // Track current index for each diagonal
for (int i =0; i < n; i++) {
for (int j =0; j < n; j++) {
int diag = i - j;
result[i][j] = diagonals[diag][indices[diag]++];
}
}
return result;
}
classSolution {
funsortMatrix(grid: Array<IntArray>): Array<IntArray> {
val n = grid.size
val diagonals = mutableMapOf<Int, MutableList<Int>>()
// Group elements by diagonal
for (i in0 until n) {
for (j in0 until n) {
val diag = i - j
diagonals.computeIfAbsent(diag) { mutableListOf() }.add(grid[i][j])
}
}
// Sort each diagonal
for ((diag, elements) in diagonals) {
if (diag >=0) {
elements.sortDescending() // Non-increasing
} else {
elements.sort() // Non-decreasing
}
}
// Place sorted elements back
val result = Array(n) { IntArray(n) }
val indices = mutableMapOf<Int, Int>()
for (i in0 until n) {
for (j in0 until n) {
val diag = i - j
val idx = indices.getOrDefault(diag, 0)
result[i][j] = diagonals[diag]!![idx]
indices[diag] = idx + 1 }
}
return result
}
}
from collections import defaultdict
defsortMatrix(grid: list[list[int]]) -> list[list[int]]:
n = len(grid)
diagonals = defaultdict(list)
# Group elements by diagonalfor i in range(n):
for j in range(n):
diag = i - j
diagonals[diag].append(grid[i][j])
# Sort each diagonalfor diag, elements in diagonals.items():
if diag >=0:
# Bottom-left triangle: non-increasing elements.sort(reverse=True)
else:
# Top-right triangle: non-decreasing elements.sort()
# Place sorted elements back result = [[0] * n for _ in range(n)]
indices = defaultdict(int)
for i in range(n):
for j in range(n):
diag = i - j
result[i][j] = diagonals[diag][indices[diag]]
indices[diag] +=1return result
use std::collections::HashMap;
pubfnsort_matrix(grid: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
let n = grid.len();
letmut diagonals: HashMap<i32, Vec<i32>>= HashMap::new();
// Group elements by diagonal
for i in0..n {
for j in0..n {
let diag = i asi32- j asi32;
diagonals.entry(diag).or_insert_with(Vec::new).push(grid[i][j]);
}
}
// Sort each diagonal
for (diag, elements) in diagonals.iter_mut() {
if*diag >=0 {
// Bottom-left triangle: non-increasing
elements.sort_by(|a, b| b.cmp(a));
} else {
// Top-right triangle: non-decreasing
elements.sort();
}
}
// Place sorted elements back
letmut result =vec![vec![0; n]; n];
letmut indices: HashMap<i32, usize>= HashMap::new();
for i in0..n {
for j in0..n {
let diag = i asi32- j asi32;
let idx =*indices.get(&diag).unwrap_or(&0);
result[i][j] = diagonals[&diag][idx];
indices.insert(diag, idx +1);
}
}
result
}