40
40
41
41
<!-- 这里可写通用的实现逻辑 -->
42
42
43
+ ** 方法一:定点遍历**
44
+
45
+ 对于每一轮 $k$,我们固定从右上方开始往左下方遍历,得到 $t$。如果 $k$ 为偶数,再将 $t$ 逆序。然后将 $t$ 添加到结果数组 $ans$ 中。
46
+
47
+ 问题的关键在于确定轮数以及每一轮的起始坐标点 $(i,j)$。
48
+
49
+ 时间复杂度 $O(m* n)$,其中 $m$ 表示 $mat$ 的行数,$n$ 表示 $mat$ 的列数。
50
+
43
51
<!-- tabs:start -->
44
52
45
53
### ** Python3**
50
58
class Solution :
51
59
def findDiagonalOrder (self , mat : List[List[int ]]) -> List[int ]:
52
60
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 ]
63
72
ans.extend(t)
64
- t.clear()
65
73
return ans
66
74
```
67
75
@@ -74,21 +82,21 @@ class Solution {
74
82
public int [] findDiagonalOrder (int [][] mat ) {
75
83
int m = mat. length, n = mat[0 ]. length;
76
84
int [] ans = new int [m * n];
77
- int k = 0 ;
85
+ int idx = 0 ;
78
86
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 ;
86
94
}
87
- if (i % 2 == 0 ) {
95
+ if (k % 2 == 0 ) {
88
96
Collections . reverse(t);
89
97
}
90
98
for (int v : t) {
91
- ans[k ++ ] = v;
99
+ ans[idx ++ ] = v;
92
100
}
93
101
t. clear();
94
102
}
@@ -106,18 +114,13 @@ public:
106
114
int m = mat.size(), n = mat[ 0] .size();
107
115
vector<int > ans;
108
116
vector<int > t;
109
- for (int i = 0; i < m + n; ++i )
117
+ for (int k = 0; k < m + n - 1 ; ++k )
110
118
{
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);
121
124
t.clear();
122
125
}
123
126
return ans;
@@ -131,18 +134,18 @@ public:
131
134
func findDiagonalOrder(mat [][]int) []int {
132
135
m, n := len(mat), len(mat[0])
133
136
var ans []int
134
- for i := 0; i < m+n; i ++ {
137
+ for k := 0; k < m+n-1; k ++ {
135
138
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
139
142
}
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--
144
147
}
145
- if i %2 == 0 {
148
+ if k %2 == 0 {
146
149
p, q := 0, len(t)-1
147
150
for p < q {
148
151
t[p], t[q] = t[q], t[p]
0 commit comments