Skip to content

Commit cc028a7

Browse files
committed
feat: update solutions to lc problem: No.0598
No.0498.Diagonal Traverse
1 parent e697b6c commit cc028a7

File tree

7 files changed

+117
-124
lines changed

7 files changed

+117
-124
lines changed

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

+44-41
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@
4040

4141
<!-- 这里可写通用的实现逻辑 -->
4242

43+
**方法一:定点遍历**
44+
45+
对于每一轮 $k$,我们固定从右上方开始往左下方遍历,得到 $t$。如果 $k$ 为偶数,再将 $t$ 逆序。然后将 $t$ 添加到结果数组 $ans$ 中。
46+
47+
问题的关键在于确定轮数以及每一轮的起始坐标点 $(i,j)$。
48+
49+
时间复杂度 $O(m*n)$,其中 $m$ 表示 $mat$ 的行数,$n$ 表示 $mat$ 的列数。
50+
4351
<!-- tabs:start -->
4452

4553
### **Python3**
@@ -50,18 +58,18 @@
5058
class Solution:
5159
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
5260
m, n = len(mat), len(mat[0])
53-
ans, t = [], []
54-
for i in range(m + n):
55-
r = 0 if i < n else i - n + 1
56-
c = i if i < n else n - 1
57-
while r < m and c >= 0:
58-
t.append(mat[r][c])
59-
r += 1
60-
c -= 1
61-
if i % 2 == 0:
62-
t.reverse()
61+
ans = []
62+
for k in range(m + n - 1):
63+
t = []
64+
i = 0 if k < n else k - n + 1
65+
j = k if k < n else n - 1
66+
while i < m and j >= 0:
67+
t.append(mat[i][j])
68+
i += 1
69+
j -= 1
70+
if k % 2 == 0:
71+
t = t[::-1]
6372
ans.extend(t)
64-
t.clear()
6573
return ans
6674
```
6775

@@ -74,21 +82,21 @@ class Solution {
7482
public int[] findDiagonalOrder(int[][] mat) {
7583
int m = mat.length, n = mat[0].length;
7684
int[] ans = new int[m * n];
77-
int k = 0;
85+
int idx = 0;
7886
List<Integer> t = new ArrayList<>();
79-
for (int i = 0; i < m + n - 1; ++i) {
80-
int r = i < n ? 0 : i - n + 1;
81-
int c = i < n ? i : n - 1;
82-
while (r < m && c >= 0) {
83-
t.add(mat[r][c]);
84-
++r;
85-
--c;
87+
for (int k = 0; k < m + n - 1; ++k) {
88+
int i = k < n ? 0 : k - n + 1;
89+
int j = k < n ? k : n - 1;
90+
while (i < m && j >= 0) {
91+
t.add(mat[i][j]);
92+
++i;
93+
--j;
8694
}
87-
if (i % 2 == 0) {
95+
if (k % 2 == 0) {
8896
Collections.reverse(t);
8997
}
9098
for (int v : t) {
91-
ans[k++] = v;
99+
ans[idx++] = v;
92100
}
93101
t.clear();
94102
}
@@ -106,18 +114,13 @@ public:
106114
int m = mat.size(), n = mat[0].size();
107115
vector<int> ans;
108116
vector<int> t;
109-
for (int i = 0; i < m + n; ++i)
117+
for (int k = 0; k < m + n - 1; ++k)
110118
{
111-
int r = i < n ? 0 : i - n + 1;
112-
int c = i < n ? i : n - 1;
113-
while (r < m && c >= 0)
114-
{
115-
t.push_back(mat[r][c]);
116-
++r;
117-
--c;
118-
}
119-
if (i % 2 == 0) reverse(t.begin(), t.end());
120-
for (int v : t) ans.push_back(v);
119+
int i = k < n ? 0 : k - n + 1;
120+
int j = k < n ? k : n - 1;
121+
while (i < m && j >= 0) t.push_back(mat[i++][j--]);
122+
if (k % 2 == 0) reverse(t.begin(), t.end());
123+
for (int& v : t) ans.push_back(v);
121124
t.clear();
122125
}
123126
return ans;
@@ -131,18 +134,18 @@ public:
131134
func findDiagonalOrder(mat [][]int) []int {
132135
m, n := len(mat), len(mat[0])
133136
var ans []int
134-
for i := 0; i < m+n; i++ {
137+
for k := 0; k < m+n-1; k++ {
135138
var t []int
136-
r, c := i-n+1, n-1
137-
if i < n {
138-
r, c = 0, i
139+
i, j := k-n+1, n-1
140+
if k < n {
141+
i, j = 0, k
139142
}
140-
for r < m && c >= 0 {
141-
t = append(t, mat[r][c])
142-
r += 1
143-
c -= 1
143+
for i < m && j >= 0 {
144+
t = append(t, mat[i][j])
145+
i++
146+
j--
144147
}
145-
if i%2 == 0 {
148+
if k%2 == 0 {
146149
p, q := 0, len(t)-1
147150
for p < q {
148151
t[p], t[q] = t[q], t[p]

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

+36-41
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,18 @@
4242
class Solution:
4343
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
4444
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()
45+
ans = []
46+
for k in range(m + n - 1):
47+
t = []
48+
i = 0 if k < n else k - n + 1
49+
j = k if k < n else n - 1
50+
while i < m and j >= 0:
51+
t.append(mat[i][j])
52+
i += 1
53+
j -= 1
54+
if k % 2 == 0:
55+
t = t[::-1]
5556
ans.extend(t)
56-
t.clear()
5757
return ans
5858
```
5959

@@ -64,21 +64,21 @@ class Solution {
6464
public int[] findDiagonalOrder(int[][] mat) {
6565
int m = mat.length, n = mat[0].length;
6666
int[] ans = new int[m * n];
67-
int k = 0;
67+
int idx = 0;
6868
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;
69+
for (int k = 0; k < m + n - 1; ++k) {
70+
int i = k < n ? 0 : k - n + 1;
71+
int j = k < n ? k : n - 1;
72+
while (i < m && j >= 0) {
73+
t.add(mat[i][j]);
74+
++i;
75+
--j;
7676
}
77-
if (i % 2 == 0) {
77+
if (k % 2 == 0) {
7878
Collections.reverse(t);
7979
}
8080
for (int v : t) {
81-
ans[k++] = v;
81+
ans[idx++] = v;
8282
}
8383
t.clear();
8484
}
@@ -96,18 +96,13 @@ public:
9696
int m = mat.size(), n = mat[0].size();
9797
vector<int> ans;
9898
vector<int> t;
99-
for (int i = 0; i < m + n; ++i)
99+
for (int k = 0; k < m + n - 1; ++k)
100100
{
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);
101+
int i = k < n ? 0 : k - n + 1;
102+
int j = k < n ? k : n - 1;
103+
while (i < m && j >= 0) t.push_back(mat[i++][j--]);
104+
if (k % 2 == 0) reverse(t.begin(), t.end());
105+
for (int& v : t) ans.push_back(v);
111106
t.clear();
112107
}
113108
return ans;
@@ -121,18 +116,18 @@ public:
121116
func findDiagonalOrder(mat [][]int) []int {
122117
m, n := len(mat), len(mat[0])
123118
var ans []int
124-
for i := 0; i < m+n; i++ {
119+
for k := 0; k < m+n-1; k++ {
125120
var t []int
126-
r, c := i-n+1, n-1
127-
if i < n {
128-
r, c = 0, i
121+
i, j := k-n+1, n-1
122+
if k < n {
123+
i, j = 0, k
129124
}
130-
for r < m && c >= 0 {
131-
t = append(t, mat[r][c])
132-
r += 1
133-
c -= 1
125+
for i < m && j >= 0 {
126+
t = append(t, mat[i][j])
127+
i++
128+
j--
134129
}
135-
if i%2 == 0 {
130+
if k%2 == 0 {
136131
p, q := 0, len(t)-1
137132
for p < q {
138133
t[p], t[q] = t[q], t[p]

solution/0400-0499/0498.Diagonal Traverse/Solution.cpp

+6-11
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,13 @@ class Solution {
44
int m = mat.size(), n = mat[0].size();
55
vector<int> ans;
66
vector<int> t;
7-
for (int i = 0; i < m + n; ++i)
7+
for (int k = 0; k < m + n - 1; ++k)
88
{
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);
9+
int i = k < n ? 0 : k - n + 1;
10+
int j = k < n ? k : n - 1;
11+
while (i < m && j >= 0) t.push_back(mat[i++][j--]);
12+
if (k % 2 == 0) reverse(t.begin(), t.end());
13+
for (int& v : t) ans.push_back(v);
1914
t.clear();
2015
}
2116
return ans;

solution/0400-0499/0498.Diagonal Traverse/Solution.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
func findDiagonalOrder(mat [][]int) []int {
22
m, n := len(mat), len(mat[0])
33
var ans []int
4-
for i := 0; i < m+n; i++ {
4+
for k := 0; k < m+n-1; k++ {
55
var t []int
6-
r, c := i-n+1, n-1
7-
if i < n {
8-
r, c = 0, i
6+
i, j := k-n+1, n-1
7+
if k < n {
8+
i, j = 0, k
99
}
10-
for r < m && c >= 0 {
11-
t = append(t, mat[r][c])
12-
r += 1
13-
c -= 1
10+
for i < m && j >= 0 {
11+
t = append(t, mat[i][j])
12+
i++
13+
j--
1414
}
15-
if i%2 == 0 {
15+
if k%2 == 0 {
1616
p, q := 0, len(t)-1
1717
for p < q {
1818
t[p], t[q] = t[q], t[p]

solution/0400-0499/0498.Diagonal Traverse/Solution.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@ class Solution {
22
public int[] findDiagonalOrder(int[][] mat) {
33
int m = mat.length, n = mat[0].length;
44
int[] ans = new int[m * n];
5-
int k = 0;
5+
int idx = 0;
66
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;
7+
for (int k = 0; k < m + n - 1; ++k) {
8+
int i = k < n ? 0 : k - n + 1;
9+
int j = k < n ? k : n - 1;
10+
while (i < m && j >= 0) {
11+
t.add(mat[i][j]);
12+
++i;
13+
--j;
1414
}
15-
if (i % 2 == 0) {
15+
if (k % 2 == 0) {
1616
Collections.reverse(t);
1717
}
1818
for (int v : t) {
19-
ans[k++] = v;
19+
ans[idx++] = v;
2020
}
2121
t.clear();
2222
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
class Solution:
22
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
33
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()
4+
ans = []
5+
for k in range(m + n - 1):
6+
t = []
7+
i = 0 if k < n else k - n + 1
8+
j = k if k < n else n - 1
9+
while i < m and j >= 0:
10+
t.append(mat[i][j])
11+
i += 1
12+
j -= 1
13+
if k % 2 == 0:
14+
t = t[::-1]
1415
ans.extend(t)
15-
t.clear()
1616
return ans

solution/2000-2099/2068.Check Whether Two Strings are Almost Equivalent/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060

6161
<!-- 这里可写通用的实现逻辑 -->
6262

63-
哈希表计数
63+
**方法一:哈希表计数**
6464

6565
<!-- tabs:start -->
6666

0 commit comments

Comments
 (0)