python系列文章目录
【python】基于cv2提取图片上的文本内容
【python】简单作图
【python】数组字符串等实用
【python】sort与sorted排序使用
【python】对角线遍历
- python系列文章目录
- 说明
- 1.分析
- 2.注意事项
- 2.1 遍历
- 2.2 区间
- 2.3 顺序
- 3.代码实现
说明
给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]
示例 1:
1.分析
对于 3 x 3 的矩阵,矩阵的坐标如下所示:
[
00
01
02
10
11
12
20
21
22
]
\left[\begin{array}{c|c|c} 00 & 01 & 02\\ \hline 10 & 11 & 12\\ \hline 20 & 21 & 22\\ \end{array}\right]
001020011121021222
需要输出的顺序是斜对角线的形式
第一斜对角线,角标和为0,如果规定从左下到右上为正序,这一条为正序。[[0,0]]
[
00
]
\left[\begin{array}{c|c|c} 00 & & \\ \hline & & \\ \hline & & \\ \end{array}\right]
00
第二斜对角线,角标和为1,逆序。[[0,1], [0,1]]
[
01
10
]
\left[\begin{array}{c|c|c} & 01 & \\ \hline 10 & & \\ \hline & & \\ \end{array}\right]
1001
第三斜对角线,角标和为2,正序。[[2,0], [1,1], [0,2]]
[
02
11
20
]
\left[\begin{array}{c|c|c} & & 02\\ \hline & 11 & \\ \hline 20 & & \\ \end{array}\right]
201102
第四斜对角线,角标和为3,逆序。[[1,2], [2,1]]
[
12
21
]
\left[\begin{array}{c|c|c} & & \\ \hline & & 12\\ \hline & 21 & \\ \end{array}\right]
2112
第五斜对角线,角标和为4,正序。[[2,2]]
[
22
]
\left[\begin{array}{c|c|c} & & \\ \hline & & \\ \hline & &22 \\ \end{array}\right]
22
2.注意事项
2.1 遍历
遍历的和为 2+2=4,即 m + n - 2
2.2 区间
横坐标的最大值不能超越2,即m-1,纵坐标的最大值不能超越2,即n-1
2.3 顺序
正序tmp与逆序tmp[::-1]要有标记,
3.代码实现
class Solution:
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
#横坐标
m = len(mat)
#纵坐标
n = len(mat[0])
result = []
#顺序标记
count = 0
for i in range(m+n-1):
tmp = []
#避免横坐标溢出
left = min(m-1, count)
right = i - left
#每一条斜对角线一个while
while right < n and left > -1:
tmp.append(mat[left][right])
left = left - 1
right = right + 1
#如果是奇数斜对角线,则逆序
if count % 2 == 1:
tmp = tmp[::-1]
#标记
count = count + 1
result.extend(tmp)
return result