|
5 | 5 |
|
6 | 6 | ## 题目大意
|
7 | 7 |
|
8 | | -给你一个大小为 `m * n` 的矩阵 `mat` 。 |
| 8 | +**描述**:给定一个大小为 `m * n` 的矩阵 `mat` 。 |
9 | 9 |
|
10 | | -要求:以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。 |
| 10 | +**要求**:以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。 |
| 11 | + |
| 12 | +**说明**: |
| 13 | + |
| 14 | +- $m == mat.length$。 |
| 15 | +- $n == mat[i].length$。 |
| 16 | +- 1ドル \le m, n \le 10^4$。 |
| 17 | +- 1ドル \le m * n \le 10^4$。 |
| 18 | +- $-10^5 \le mat[i][j] \le 10^5$。 |
| 19 | + |
| 20 | +**示例**: |
| 21 | + |
| 22 | +```Python |
| 23 | +输入:mat = [[1,2,3],[4,5,6],[7,8,9]] |
| 24 | +输出:[1,2,4,7,5,3,6,8,9] |
| 25 | +``` |
| 26 | + |
| 27 | + |
11 | 28 |
|
12 | 29 | ## 解题思路
|
13 | 30 |
|
| 31 | +### 思路 1:找规律 + 考虑边界问题 |
| 32 | + |
14 | 33 | 这道题的关键是「找规律」和「考虑边界问题」。
|
15 | 34 |
|
16 | 35 | 找规律:
|
17 | 36 |
|
18 | | -- 当行号 + 列号为偶数时,遍历方向为从左下到右上。可以记为右上方向(-1, +1),即行号 -1,列号 +1。 |
19 | | -- 当行号 + 列号为奇数时,遍历方向为从右上到左下。可以记为左下方向(+1, -1),即行号 +1,列号 -1。 |
| 37 | +1. 当「行号 + 列号」为偶数时,遍历方向为从左下到右上。可以记为右上方向`(-1, +1)`,即行号减 `1`,列号加 `1`。 |
| 38 | +2. 当「行号 + 列号」为奇数时,遍历方向为从右上到左下。可以记为左下方向`(+1, -1)`,即行号加 `1`,列号减 `1`。 |
20 | 39 |
|
21 | 40 | 边界情况:
|
22 | 41 |
|
23 | | -- 向右上方向移动时: |
24 | | - - 如果在最后一列,则向下方移动,即 `x += 1`。 |
25 | | - - 如果在第一行,则向右方移动,即 `y += 1`。 |
26 | | - - 其余情况想右上方向移动,即 `x -= 1`、`y += 1`。 |
27 | | -- 向左下方向移动时: |
28 | | - - 如果在最后一行,则向右方移动,即 `y += 1`。 |
29 | | - - 如果在第一列,则向下方移动,即 `x += 1`。 |
30 | | - - 其余情况向左下方向移动,即 `x += 1`、`y -= 1`。 |
| 42 | +1. 向右上方向移动时: |
| 43 | + 1. 如果在最后一列,则向下方移动,即 `x += 1`。 |
| 44 | + 2. 如果在第一行,则向右方移动,即 `y += 1`。 |
| 45 | + 3. 其余情况想右上方向移动,即 `x -= 1`、`y += 1`。 |
| 46 | +2. 向左下方向移动时: |
| 47 | + 1. 如果在最后一行,则向右方移动,即 `y += 1`。 |
| 48 | + 2. 如果在第一列,则向下方移动,即 `x += 1`。 |
| 49 | + 3. 其余情况向左下方向移动,即 `x += 1`、`y -= 1`。 |
31 | 50 |
|
32 | | -##代码 |
| 51 | +### 思路 1:代码 |
33 | 52 |
|
34 | 53 | ```Python
|
35 | 54 | class Solution:
|
@@ -68,6 +87,11 @@ class Solution:
|
68 | 87 | return ans
|
69 | 88 | ```
|
70 | 89 |
|
| 90 | +### 思路 1:复杂度分析 |
| 91 | + |
| 92 | +- **时间复杂度**:$O(m \times n)$。其中 $m$、$n$ 分别为二维矩阵的行数、列数。 |
| 93 | +- **空间复杂度**:$O(m * n)$。如果算上答案数组的空间占用,则空间复杂度为 $O(m * n)$。不算上则空间复杂度为 $O(1)$。 |
| 94 | + |
71 | 95 | ## 参考资料
|
72 | 96 |
|
73 | 97 | - 【题解】[「498. 对角线遍历」最简单易懂! - 对角线遍历 - 力扣(LeetCode)](https://leetcode.cn/problems/diagonal-traverse/solution/498-dui-jiao-xian-bian-li-zui-jian-dan-y-ibu3/)
|
|
0 commit comments