Skip to content

Commit 58e70ed

Browse files
authored
feat: add solutions to lc problem: No.0498 (#4666)
No.0498.Diagonal Traverse
1 parent 94174b4 commit 58e70ed

File tree

7 files changed

+263
-230
lines changed

7 files changed

+263
-230
lines changed

solution/0400-0499/0498.Diagonal Traverse/README.md

Lines changed: 90 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
121121
class Solution {
122122
public:
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
143150
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)
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
176181
function 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
216206
impl 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

Comments
 (0)