|
22 | 22 | <strong>输出:</strong> [1,2,4,7,5,3,6,8,9]
|
23 | 23 |
|
24 | 24 | <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;"> |
26 | 26 | </pre>
|
27 | 27 |
|
28 | 28 | <p> </p>
|
|
33 | 33 | <li>给定矩阵中的元素总数不会超过 100000 。</li>
|
34 | 34 | </ol>
|
35 | 35 |
|
36 |
| - |
37 | 36 | ## 解法
|
38 | 37 |
|
39 | 38 | <!-- 这里可写通用的实现逻辑 -->
|
|
45 | 44 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
46 | 45 |
|
47 | 46 | ```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 |
49 | 63 | ```
|
50 | 64 |
|
51 | 65 | ### **Java**
|
52 | 66 |
|
53 | 67 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
54 | 68 |
|
55 | 69 | ```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 | +``` |
56 | 124 |
|
| 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 | +} |
57 | 156 | ```
|
58 | 157 |
|
59 | 158 | ### **...**
|
|
0 commit comments