Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 102 additions & 3 deletions
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‎

Lines changed: 101 additions & 2 deletions
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
### **...**
Lines changed: 23 additions & 0 deletions
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+
};
Lines changed: 28 additions & 0 deletions
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+
}
Lines changed: 25 additions & 0 deletions
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+
}
Lines changed: 16 additions & 0 deletions
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
18.4 KB
Loading[フレーム]
-10.8 KB
Binary file not shown.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /