@@ -56,11 +56,11 @@ tags:
5656
5757### 方法一:定点遍历
5858
59- 对于每一轮 $k$,我们固定从右上方开始往左下方遍历,得到 $t$。如果 $k$ 为偶数,再将 $t$ 逆序。然后将 $t$ 添加到结果数组 ` ans ` 中。
59+ 对于每一轮 $k$,我们固定从右上方开始往左下方遍历,得到 $t$。如果 $k$ 为偶数,再将 $t$ 逆序。然后将 $t$ 添加到结果数组 $\textit{ ans}$ 中。
6060
61- 问题的关键在于确定轮数以及每一轮的起始坐标点 $(i,j)$。
61+ 问题的关键在于确定轮数以及每一轮的起始坐标点 $(i, j)$。
6262
63- 时间复杂度 $O(m\times n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数。
63+ 时间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数。忽略答案的空间消耗,空间复杂度 $O(1)$ 。
6464
6565<!-- tabs:start -->
6666
@@ -121,15 +121,22 @@ class Solution {
121121class Solution {
122122public:
123123 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();
125126 vector<int > ans;
126127 vector<int > t;
127128 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());
133140 t.clear();
134141 }
135142 return ans;
@@ -141,30 +148,28 @@ public:
141148
142149```go
143150func 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)
146154 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
149157 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
151163 }
152164 for i < m && j >= 0 {
153165 t = append(t, mat[i][j])
154166 i++
155167 j--
156168 }
157169 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)
167171 }
172+ ans = append(ans, t...)
168173 }
169174 return ans
170175}
@@ -174,39 +179,24 @@ func findDiagonalOrder(mat [][]int) []int {
174179
175180``` ts
176181function findDiagonalOrder(mat : number [][]): number [] {
177- const res = [];
178182 const m = mat .length ;
179183 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 ]);
194191 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 -- ;
206193 }
207- mark = ! mark ;
194+ if (k % 2 === 0 ) {
195+ t .reverse ();
196+ }
197+ ans .push (... t );
208198 }
209- return res ;
199+ return ans ;
210200}
211201```
212202
@@ -215,33 +205,55 @@ function findDiagonalOrder(mat: number[][]): number[] {
215205``` rust
216206impl Solution {
217207 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 ();
245257 }
246258}
247259```
0 commit comments