@@ -56,11 +56,11 @@ tags:
56
56
57
57
### 方法一:定点遍历
58
58
59
- 对于每一轮 $k$,我们固定从右上方开始往左下方遍历,得到 $t$。如果 $k$ 为偶数,再将 $t$ 逆序。然后将 $t$ 添加到结果数组 ` ans ` 中。
59
+ 对于每一轮 $k$,我们固定从右上方开始往左下方遍历,得到 $t$。如果 $k$ 为偶数,再将 $t$ 逆序。然后将 $t$ 添加到结果数组 $\textit{ ans}$ 中。
60
60
61
- 问题的关键在于确定轮数以及每一轮的起始坐标点 $(i,j)$。
61
+ 问题的关键在于确定轮数以及每一轮的起始坐标点 $(i, j)$。
62
62
63
- 时间复杂度 $O(m\times n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数。
63
+ 时间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数。忽略答案的空间消耗,空间复杂度 $O(1)$ 。
64
64
65
65
<!-- tabs:start -->
66
66
@@ -121,15 +121,22 @@ class Solution {
121
121
class Solution {
122
122
public:
123
123
vector<int > findDiagonalOrder(vector<vector<int >>& mat) {
124
- int m = mat.size(), n = mat[ 0] .size();
124
+ int m = mat.size();
125
+ int n = mat[ 0] .size();
125
126
vector<int > ans;
126
127
vector<int > t;
127
128
for (int k = 0; k < m + n - 1; ++k) {
128
- int i = k < n ? 0 : k - n + 1;
129
- int j = k < n ? k : n - 1;
130
- while (i < m && j >= 0) t.push_back(mat[ i++] [ j-- ] );
131
- if (k % 2 == 0) reverse(t.begin(), t.end());
132
- for (int& v : t) ans.push_back(v);
129
+ int i = (k < n) ? 0 : k - n + 1;
130
+ int j = (k < n) ? k : n - 1;
131
+ while (i < m && j >= 0) {
132
+ t.push_back(mat[ i] [ j ] );
133
+ ++i;
134
+ --j;
135
+ }
136
+ if (k % 2 == 0) {
137
+ ranges::reverse(t);
138
+ }
139
+ ans.insert(ans.end(), t.begin(), t.end());
133
140
t.clear();
134
141
}
135
142
return ans;
@@ -141,30 +148,28 @@ public:
141
148
142
149
```go
143
150
func findDiagonalOrder(mat [][]int) []int {
144
- m, n := len(mat), len(mat[0])
145
- var ans []int
151
+ m := len(mat)
152
+ n := len(mat[0])
153
+ ans := make([]int, 0, m*n)
146
154
for k := 0; k < m+n-1; k++ {
147
- var t []int
148
- i, j := k-n+1, n-1
155
+ t := make( []int, 0)
156
+ var i, j int
149
157
if k < n {
150
- i, j = 0, k
158
+ i = 0
159
+ j = k
160
+ } else {
161
+ i = k - n + 1
162
+ j = n - 1
151
163
}
152
164
for i < m && j >= 0 {
153
165
t = append(t, mat[i][j])
154
166
i++
155
167
j--
156
168
}
157
169
if k%2 == 0 {
158
- p, q := 0, len(t)-1
159
- for p < q {
160
- t[p], t[q] = t[q], t[p]
161
- p++
162
- q--
163
- }
164
- }
165
- for _, v := range t {
166
- ans = append(ans, v)
170
+ slices.Reverse(t)
167
171
}
172
+ ans = append(ans, t...)
168
173
}
169
174
return ans
170
175
}
@@ -174,39 +179,24 @@ func findDiagonalOrder(mat [][]int) []int {
174
179
175
180
``` ts
176
181
function findDiagonalOrder(mat : number [][]): number [] {
177
- const res = [];
178
182
const m = mat .length ;
179
183
const n = mat [0 ].length ;
180
- let i = 0 ;
181
- let j = 0 ;
182
- let mark = true ;
183
- while (res .length !== n * m ) {
184
- if (mark ) {
185
- while (i >= 0 && j < n ) {
186
- res .push (mat [i ][j ]);
187
- i -- ;
188
- j ++ ;
189
- }
190
- if (j === n ) {
191
- j -- ;
192
- i ++ ;
193
- }
184
+ const ans: number [] = [];
185
+ for (let k = 0 ; k < m + n - 1 ; k ++ ) {
186
+ const t: number [] = [];
187
+ let i = k < n ? 0 : k - n + 1 ;
188
+ let j = k < n ? k : n - 1 ;
189
+ while (i < m && j >= 0 ) {
190
+ t .push (mat [i ][j ]);
194
191
i ++ ;
195
- } else {
196
- while (i < m && j >= 0 ) {
197
- res .push (mat [i ][j ]);
198
- i ++ ;
199
- j -- ;
200
- }
201
- if (i === m ) {
202
- i -- ;
203
- j ++ ;
204
- }
205
- j ++ ;
192
+ j -- ;
206
193
}
207
- mark = ! mark ;
194
+ if (k % 2 === 0 ) {
195
+ t .reverse ();
196
+ }
197
+ ans .push (... t );
208
198
}
209
- return res ;
199
+ return ans ;
210
200
}
211
201
```
212
202
@@ -215,33 +205,55 @@ function findDiagonalOrder(mat: number[][]): number[] {
215
205
``` rust
216
206
impl Solution {
217
207
pub fn find_diagonal_order (mat : Vec <Vec <i32 >>) -> Vec <i32 > {
218
- let (m , n ) = (mat . len (), mat [0 ]. len ());
219
- let (mut i , mut j ) = (0 , 0 );
220
- (0 .. m * n )
221
- . map (| _ | {
222
- let res = mat [i ][j ];
223
- if (i + j ) % 2 == 0 {
224
- if j == n - 1 {
225
- i += 1 ;
226
- } else if i == 0 {
227
- j += 1 ;
228
- } else {
229
- i -= 1 ;
230
- j += 1 ;
231
- }
232
- } else {
233
- if i == m - 1 {
234
- j += 1 ;
235
- } else if j == 0 {
236
- i += 1 ;
237
- } else {
238
- i += 1 ;
239
- j -= 1 ;
240
- }
241
- }
242
- res
243
- })
244
- . collect ()
208
+ let m = mat . len ();
209
+ let n = mat [0 ]. len ();
210
+ let mut ans = Vec :: with_capacity (m * n );
211
+ for k in 0 .. (m + n - 1 ) {
212
+ let mut t = Vec :: new ();
213
+ let (mut i , mut j ) = if k < n {
214
+ (0 , k )
215
+ } else {
216
+ (k - n + 1 , n - 1 )
217
+ };
218
+ while i < m && j < n {
219
+ t . push (mat [i ][j ]);
220
+ i += 1 ;
221
+ if j == 0 { break ; }
222
+ j -= 1 ;
223
+ }
224
+ if k % 2 == 0 {
225
+ t . reverse ();
226
+ }
227
+ ans . extend (t );
228
+ }
229
+ ans
230
+ }
231
+ }
232
+ ```
233
+
234
+ #### C#
235
+
236
+ ``` cs
237
+ public class Solution {
238
+ public int [] FindDiagonalOrder (int [][] mat ) {
239
+ int m = mat .Length ;
240
+ int n = mat [0 ].Length ;
241
+ List < int > ans = new List <int >();
242
+ for (int k = 0 ; k < m + n - 1 ; k ++ ) {
243
+ List < int > t = new List <int >();
244
+ int i = k < n ? 0 : k - n + 1 ;
245
+ int j = k < n ? k : n - 1 ;
246
+ while (i < m && j >= 0 ) {
247
+ t .Add (mat [i ][j ]);
248
+ i ++ ;
249
+ j -- ;
250
+ }
251
+ if (k % 2 == 0 ) {
252
+ t .Reverse ();
253
+ }
254
+ ans .AddRange (t );
255
+ }
256
+ return ans .ToArray ();
245
257
}
246
258
}
247
259
```
0 commit comments