持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- m == mat.length
- n == mat[i].length
- 1 <= m, n <= 104
- 1 <= m * n <= 104
- -105 <= mat[i][j] <= 105
二、思路分析:
我们读取本题,从题目中获知对一组m*n的数组按对角线进行遍历后,输出一个一维数组。在该题中,我们还需要明确如下几点信息:
- mat[i]元素所有的长度都是一致的
- m*n 矩形的边界,最大行为len(mat),最大列为len(mat[0])
- 偶数线路(黑色):m 值呈现递减状态
- 奇数线路(红色):m 值呈现递增状态
因此,我们解答本题可以使用线路模拟的方法来解答,思路如下:
- 首先求出m*n矩阵中存在线路总数为 len(mat)+len(mat[0])-1
- 当线路为偶数线路时:
- 当i<len(mat),m取值应该为取i,n取值为0
- 当i>=len(mat),m取值应该为取len(mat)-1,n取值为i-len(mat)+1;
- 当线路为奇数线路时:
- 当i<len(mat[0]),m取值为0,n取值为i
- 当i>=len(mat[0]),m取值为i-len(mat[0])+1,n取值为len(mat[0])-1
- 偶数路线m值是递减,n值是递增;奇数路线m值是递增,n值是递减
根据以上思路,我们使用python来实现,代码如下:
class Solution(object):
def findDiagonalOrder(self, mat):
"""
:type mat: List[List[int]]
:rtype: List[int]
"""
max_m = len(mat)
max_n = len(mat[0])
maxroute = max_m + max_n - 1
ans = []
for i in range(maxroute):
if i%2 == 0:
m = i if i < max_m else max_m-1
n = 0 if i < max_m else i-max_m+1
while m >=0 and n < max_n:
ans.append(mat[m][n])
m -=1
n +=1
else:
m = 0 if i < max_n else i-max_n+1
n = i if i < max_n else max_n-1
while m < max_m and n >= 0:
ans.append(mat[m][n])
m +=1
n -=1
return ans
复制代码
三、总结:
本题考察我们对矩形坐标位置关系规律查找,可以分为偶数线和奇数线,AC代码提交记录如下:
- 时间复杂度O(m*n),m为mat长度,n为mat[i]的长度
- 空间复杂度O(1)
以上是本期内容,欢迎大佬们点赞评论,下期见~~~