43
43
44
44
## 解法
45
45
46
- ### 方法一
46
+ ### 方法一:排序
47
+
48
+ 我们可以将矩阵中的每条对角线看作一个数组,然后对这些数组进行排序,最后再将排序后的元素填回原矩阵中。
49
+
50
+ 具体地,我们记矩阵的行数为 $m$,列数为 $n$。由于同一条对角线上的任意两个元素 $(i_1, j_1)$ 和 $(i_2, j_2)$ 满足 $j_1 - i_1 = j_2 - i_2$,我们可以根据 $j - i$ 的值来确定每条对角线。为了保证值为正数,我们加上一个偏移量 $m$,即 $m - i + j$。
51
+
52
+ 最后,我们将每条对角线上的元素排序后填回原矩阵中即可。
53
+
54
+ 时间复杂度 $O(m \times n \times \log \min(m, n))$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
47
55
48
56
<!-- tabs:start -->
49
57
50
58
``` python
51
59
class Solution :
52
60
def diagonalSort (self , mat : List[List[int ]]) -> List[List[int ]]:
53
61
m, n = len (mat), len (mat[0 ])
54
- for k in range (min (m, n) - 1 ):
55
- for i in range (m - 1 ):
56
- for j in range (n - 1 ):
57
- if mat[i][j] > mat[i + 1 ][j + 1 ]:
58
- mat[i][j], mat[i + 1 ][j + 1 ] = mat[i + 1 ][j + 1 ], mat[i][j]
62
+ g = [[] for _ in range (m + n)]
63
+ for i, row in enumerate (mat):
64
+ for j, x in enumerate (row):
65
+ g[m - i + j].append(x)
66
+ for e in g:
67
+ e.sort(reverse = True )
68
+ for i in range (m):
69
+ for j in range (n):
70
+ mat[i][j] = g[m - i + j].pop()
59
71
return mat
60
72
```
61
73
62
74
``` java
63
75
class Solution {
64
76
public int [][] diagonalSort (int [][] mat ) {
65
77
int m = mat. length, n = mat[0 ]. length;
66
- for (int k = 0 ; k < Math . min(m, n) - 1 ; ++ k) {
67
- for (int i = 0 ; i < m - 1 ; ++ i) {
68
- for (int j = 0 ; j < n - 1 ; ++ j) {
69
- if (mat[i][j] > mat[i + 1 ][j + 1 ]) {
70
- int t = mat[i][j];
71
- mat[i][j] = mat[i + 1 ][j + 1 ];
72
- mat[i + 1 ][j + 1 ] = t;
73
- }
74
- }
78
+ List<Integer > [] g = new List [m + n];
79
+ Arrays . setAll(g, k - > new ArrayList<> ());
80
+ for (int i = 0 ; i < m; ++ i) {
81
+ for (int j = 0 ; j < n; ++ j) {
82
+ g[m - i + j]. add(mat[i][j]);
83
+ }
84
+ }
85
+ for (var e : g) {
86
+ Collections . sort(e, (a, b) - > b - a);
87
+ }
88
+ for (int i = 0 ; i < m; ++ i) {
89
+ for (int j = 0 ; j < n; ++ j) {
90
+ mat[i][j] = g[m - i + j]. removeLast();
75
91
}
76
92
}
77
93
return mat;
@@ -84,11 +100,21 @@ class Solution {
84
100
public:
85
101
vector<vector<int >> diagonalSort(vector<vector<int >>& mat) {
86
102
int m = mat.size(), n = mat[ 0] .size();
87
- for (int k = 0; k < min(m, n) - 1; ++k)
88
- for (int i = 0; i < m - 1; ++i)
89
- for (int j = 0; j < n - 1; ++j)
90
- if (mat[ i] [ j ] > mat[ i + 1] [ j + 1 ] )
91
- swap(mat[ i] [ j ] , mat[ i + 1] [ j + 1 ] );
103
+ vector<int > g[ m + n] ;
104
+ for (int i = 0; i < m; ++i) {
105
+ for (int j = 0; j < n; ++j) {
106
+ g[ m - i + j] .push_back(mat[ i] [ j ] );
107
+ }
108
+ }
109
+ for (auto& e : g) {
110
+ sort(e.rbegin(), e.rend());
111
+ }
112
+ for (int i = 0; i < m; ++i) {
113
+ for (int j = 0; j < n; ++j) {
114
+ mat[ i] [ j ] = g[ m - i + j] .back();
115
+ g[ m - i + j] .pop_back();
116
+ }
117
+ }
92
118
return mat;
93
119
}
94
120
};
@@ -97,19 +123,100 @@ public:
97
123
```go
98
124
func diagonalSort(mat [][]int) [][]int {
99
125
m, n := len(mat), len(mat[0])
100
- for k := 0; k < m-1 && k < n-1; k++ {
101
- for i := 0; i < m-1; i++ {
102
- for j := 0; j < n-1; j++ {
103
- if mat[i][j] > mat[i+1][j+1] {
104
- mat[i][j], mat[i+1][j+1] = mat[i+1][j+1], mat[i][j]
105
- }
106
- }
126
+ g := make([][]int, m+n)
127
+ for i, row := range mat {
128
+ for j, x := range row {
129
+ g[m-i+j] = append(g[m-i+j], x)
130
+ }
131
+ }
132
+ for _, e := range g {
133
+ sort.Sort(sort.Reverse(sort.IntSlice(e)))
134
+ }
135
+ for i, row := range mat {
136
+ for j := range row {
137
+ k := len(g[m-i+j])
138
+ mat[i][j] = g[m-i+j][k-1]
139
+ g[m-i+j] = g[m-i+j][:k-1]
107
140
}
108
141
}
109
142
return mat
110
143
}
111
144
```
112
145
146
+ ``` ts
147
+ function diagonalSort(mat : number [][]): number [][] {
148
+ const [m, n] = [mat .length , mat [0 ].length ];
149
+ const g: number [][] = Array .from ({ length: m + n }, () => []);
150
+ for (let i = 0 ; i < m ; ++ i ) {
151
+ for (let j = 0 ; j < n ; ++ j ) {
152
+ g [m - i + j ].push (mat [i ][j ]);
153
+ }
154
+ }
155
+ for (const e of g ) {
156
+ e .sort ((a , b ) => b - a );
157
+ }
158
+ for (let i = 0 ; i < m ; ++ i ) {
159
+ for (let j = 0 ; j < n ; ++ j ) {
160
+ mat [i ][j ] = g [m - i + j ].pop ()! ;
161
+ }
162
+ }
163
+ return mat ;
164
+ }
165
+ ```
166
+
167
+ ``` rust
168
+ impl Solution {
169
+ pub fn diagonal_sort (mut mat : Vec <Vec <i32 >>) -> Vec <Vec <i32 >> {
170
+ let m = mat . len ();
171
+ let n = mat [0 ]. len ();
172
+ let mut g : Vec <Vec <i32 >> = vec! [vec! []; m + n ];
173
+ for i in 0 .. m {
174
+ for j in 0 .. n {
175
+ g [m - i + j ]. push (mat [i ][j ]);
176
+ }
177
+ }
178
+ for e in & mut g {
179
+ e . sort_by (| a , b | b . cmp (a ));
180
+ }
181
+ for i in 0 .. m {
182
+ for j in 0 .. n {
183
+ mat [i ][j ] = g [m - i + j ]. pop (). unwrap ();
184
+ }
185
+ }
186
+ mat
187
+ }
188
+ }
189
+ ```
190
+
191
+ ``` cs
192
+ public class Solution {
193
+ public int [][] DiagonalSort (int [][] mat ) {
194
+ int m = mat .Length ;
195
+ int n = mat [0 ].Length ;
196
+ List < List < int >> g = new List <List <int >>();
197
+ for (int i = 0 ; i < m + n ; i ++ ) {
198
+ g .Add (new List <int >());
199
+ }
200
+ for (int i = 0 ; i < m ; i ++ ) {
201
+ for (int j = 0 ; j < n ; j ++ ) {
202
+ g [m - i + j ].Add (mat [i ][j ]);
203
+ }
204
+ }
205
+ foreach (var e in g ) {
206
+ e .Sort ((a , b ) => b .CompareTo (a ));
207
+ }
208
+ for (int i = 0 ; i < m ; i ++ ) {
209
+ for (int j = 0 ; j < n ; j ++ ) {
210
+ int val = g [m - i + j ][g [m - i + j ].Count - 1 ];
211
+ g [m - i + j ].RemoveAt (g [m - i + j ].Count - 1 );
212
+ mat [i ][j ] = val ;
213
+ }
214
+ }
215
+ return mat ;
216
+ }
217
+ }
218
+ ```
219
+
113
220
<!-- tabs: end -->
114
221
115
222
<!-- end -->
0 commit comments