Skip to content

Commit fa001c9

Browse files
committed
feat: add solutions to lc problem: No.0498
No.0498.Diagonal Traverse
1 parent 362546b commit fa001c9

File tree

8 files changed

+295
-5
lines changed

8 files changed

+295
-5
lines changed

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

+102-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<strong>输出:</strong> [1,2,4,7,5,3,6,8,9]
2323

2424
<strong>解释:</strong>
25-
<img src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0400-0499/0498.Diagonal%20Traverse/images/diagonal_traverse.png" style="width: 220px;">
25+
<img src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0400-0499/0498.Diagonal%20Traverse/images/diag1-grid.jpg" style="width: 220px;">
2626
</pre>
2727

2828
<p>&nbsp;</p>
@@ -33,7 +33,6 @@
3333
<li>给定矩阵中的元素总数不会超过 100000 。</li>
3434
</ol>
3535

36-
3736
## 解法
3837

3938
<!-- 这里可写通用的实现逻辑 -->
@@ -45,15 +44,115 @@
4544
<!-- 这里可写当前语言的特殊实现逻辑 -->
4645

4746
```python
48-
47+
class Solution:
48+
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
49+
m, n = len(mat), len(mat[0])
50+
ans, t = [], []
51+
for i in range(m + n):
52+
r = 0 if i < n else i - n + 1
53+
c = i if i < n else n - 1
54+
while r < m and c >= 0:
55+
t.append(mat[r][c])
56+
r += 1
57+
c -= 1
58+
if i % 2 == 0:
59+
t.reverse()
60+
ans.extend(t)
61+
t.clear()
62+
return ans
4963
```
5064

5165
### **Java**
5266

5367
<!-- 这里可写当前语言的特殊实现逻辑 -->
5468

5569
```java
70+
class Solution {
71+
public int[] findDiagonalOrder(int[][] mat) {
72+
int m = mat.length, n = mat[0].length;
73+
int[] ans = new int[m * n];
74+
int k = 0;
75+
List<Integer> t = new ArrayList<>();
76+
for (int i = 0; i < m + n - 1; ++i) {
77+
int r = i < n ? 0 : i - n + 1;
78+
int c = i < n ? i : n - 1;
79+
while (r < m && c >= 0) {
80+
t.add(mat[r][c]);
81+
++r;
82+
--c;
83+
}
84+
if (i % 2 == 0) {
85+
Collections.reverse(t);
86+
}
87+
for (int v : t) {
88+
ans[k++] = v;
89+
}
90+
t.clear();
91+
}
92+
return ans;
93+
}
94+
}
95+
```
96+
97+
### **C++**
98+
99+
```cpp
100+
class Solution {
101+
public:
102+
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
103+
int m = mat.size(), n = mat[0].size();
104+
vector<int> ans;
105+
vector<int> t;
106+
for (int i = 0; i < m + n; ++i)
107+
{
108+
int r = i < n ? 0 : i - n + 1;
109+
int c = i < n ? i : n - 1;
110+
while (r < m && c >= 0)
111+
{
112+
t.push_back(mat[r][c]);
113+
++r;
114+
--c;
115+
}
116+
if (i % 2 == 0) reverse(t.begin(), t.end());
117+
for (int v : t) ans.push_back(v);
118+
t.clear();
119+
}
120+
return ans;
121+
}
122+
};
123+
```
56124
125+
### **Go**
126+
127+
```go
128+
func findDiagonalOrder(mat [][]int) []int {
129+
m, n := len(mat), len(mat[0])
130+
var ans []int
131+
for i := 0; i < m+n; i++ {
132+
var t []int
133+
r, c := i-n+1, n-1
134+
if i < n {
135+
r, c = 0, i
136+
}
137+
for r < m && c >= 0 {
138+
t = append(t, mat[r][c])
139+
r += 1
140+
c -= 1
141+
}
142+
if i%2 == 0 {
143+
p, q := 0, len(t)-1
144+
for p < q {
145+
t[p], t[q] = t[q], t[p]
146+
p++
147+
q--
148+
}
149+
}
150+
for _, v := range t {
151+
ans = append(ans, v)
152+
}
153+
}
154+
return ans
155+
}
57156
```
58157

59158
### **...**

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

+101-2
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,120 @@
3232
<li><code>-10<sup>5</sup> &lt;= mat[i][j] &lt;= 10<sup>5</sup></code></li>
3333
</ul>
3434

35-
3635
## Solutions
3736

3837
<!-- tabs:start -->
3938

4039
### **Python3**
4140

4241
```python
43-
42+
class Solution:
43+
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
44+
m, n = len(mat), len(mat[0])
45+
ans, t = [], []
46+
for i in range(m + n):
47+
r = 0 if i < n else i - n + 1
48+
c = i if i < n else n - 1
49+
while r < m and c >= 0:
50+
t.append(mat[r][c])
51+
r += 1
52+
c -= 1
53+
if i % 2 == 0:
54+
t.reverse()
55+
ans.extend(t)
56+
t.clear()
57+
return ans
4458
```
4559

4660
### **Java**
4761

4862
```java
63+
class Solution {
64+
public int[] findDiagonalOrder(int[][] mat) {
65+
int m = mat.length, n = mat[0].length;
66+
int[] ans = new int[m * n];
67+
int k = 0;
68+
List<Integer> t = new ArrayList<>();
69+
for (int i = 0; i < m + n - 1; ++i) {
70+
int r = i < n ? 0 : i - n + 1;
71+
int c = i < n ? i : n - 1;
72+
while (r < m && c >= 0) {
73+
t.add(mat[r][c]);
74+
++r;
75+
--c;
76+
}
77+
if (i % 2 == 0) {
78+
Collections.reverse(t);
79+
}
80+
for (int v : t) {
81+
ans[k++] = v;
82+
}
83+
t.clear();
84+
}
85+
return ans;
86+
}
87+
}
88+
```
89+
90+
### **C++**
91+
92+
```cpp
93+
class Solution {
94+
public:
95+
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
96+
int m = mat.size(), n = mat[0].size();
97+
vector<int> ans;
98+
vector<int> t;
99+
for (int i = 0; i < m + n; ++i)
100+
{
101+
int r = i < n ? 0 : i - n + 1;
102+
int c = i < n ? i : n - 1;
103+
while (r < m && c >= 0)
104+
{
105+
t.push_back(mat[r][c]);
106+
++r;
107+
--c;
108+
}
109+
if (i % 2 == 0) reverse(t.begin(), t.end());
110+
for (int v : t) ans.push_back(v);
111+
t.clear();
112+
}
113+
return ans;
114+
}
115+
};
116+
```
49117
118+
### **Go**
119+
120+
```go
121+
func findDiagonalOrder(mat [][]int) []int {
122+
m, n := len(mat), len(mat[0])
123+
var ans []int
124+
for i := 0; i < m+n; i++ {
125+
var t []int
126+
r, c := i-n+1, n-1
127+
if i < n {
128+
r, c = 0, i
129+
}
130+
for r < m && c >= 0 {
131+
t = append(t, mat[r][c])
132+
r += 1
133+
c -= 1
134+
}
135+
if i%2 == 0 {
136+
p, q := 0, len(t)-1
137+
for p < q {
138+
t[p], t[q] = t[q], t[p]
139+
p++
140+
q--
141+
}
142+
}
143+
for _, v := range t {
144+
ans = append(ans, v)
145+
}
146+
}
147+
return ans
148+
}
50149
```
51150

52151
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
4+
int m = mat.size(), n = mat[0].size();
5+
vector<int> ans;
6+
vector<int> t;
7+
for (int i = 0; i < m + n; ++i)
8+
{
9+
int r = i < n ? 0 : i - n + 1;
10+
int c = i < n ? i : n - 1;
11+
while (r < m && c >= 0)
12+
{
13+
t.push_back(mat[r][c]);
14+
++r;
15+
--c;
16+
}
17+
if (i % 2 == 0) reverse(t.begin(), t.end());
18+
for (int v : t) ans.push_back(v);
19+
t.clear();
20+
}
21+
return ans;
22+
}
23+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
func findDiagonalOrder(mat [][]int) []int {
2+
m, n := len(mat), len(mat[0])
3+
var ans []int
4+
for i := 0; i < m+n; i++ {
5+
var t []int
6+
r, c := i-n+1, n-1
7+
if i < n {
8+
r, c = 0, i
9+
}
10+
for r < m && c >= 0 {
11+
t = append(t, mat[r][c])
12+
r += 1
13+
c -= 1
14+
}
15+
if i%2 == 0 {
16+
p, q := 0, len(t)-1
17+
for p < q {
18+
t[p], t[q] = t[q], t[p]
19+
p++
20+
q--
21+
}
22+
}
23+
for _, v := range t {
24+
ans = append(ans, v)
25+
}
26+
}
27+
return ans
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public int[] findDiagonalOrder(int[][] mat) {
3+
int m = mat.length, n = mat[0].length;
4+
int[] ans = new int[m * n];
5+
int k = 0;
6+
List<Integer> t = new ArrayList<>();
7+
for (int i = 0; i < m + n - 1; ++i) {
8+
int r = i < n ? 0 : i - n + 1;
9+
int c = i < n ? i : n - 1;
10+
while (r < m && c >= 0) {
11+
t.add(mat[r][c]);
12+
++r;
13+
--c;
14+
}
15+
if (i % 2 == 0) {
16+
Collections.reverse(t);
17+
}
18+
for (int v : t) {
19+
ans[k++] = v;
20+
}
21+
t.clear();
22+
}
23+
return ans;
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
3+
m, n = len(mat), len(mat[0])
4+
ans, t = [], []
5+
for i in range(m + n):
6+
r = 0 if i < n else i - n + 1
7+
c = i if i < n else n - 1
8+
while r < m and c >= 0:
9+
t.append(mat[r][c])
10+
r += 1
11+
c -= 1
12+
if i % 2 == 0:
13+
t.reverse()
14+
ans.extend(t)
15+
t.clear()
16+
return ans
Loading
Binary file not shown.

0 commit comments

Comments
 (0)