我们来看一下针对于上一题,大佬是如何写的
大家先看这个轨迹 是如何进行运行的 就是一开始向右上方移动 如果碰壁 那就向左下角移动 如果碰壁 继续向右上角移动
那么设置一个result数组用来存储矩阵中的元素 开始的rows和col设置为0 看有几种碰到边界的情况 如果碰到的是右边界col=n-1 也就是col变成n-1了 那么就调转方向而且向下移动 如果碰到的是上边界 rows=0 那么就向右边移动 并且调转方向 不然的话就是往右上方移动 就是rows-1 col+1
如果是往左下方走呢 如果碰到了左方 也就是col=0 那么就往下走 并且调转方向 如果碰到了下方 rows=2 那么就是向右走 并且调转方向
向下走向右走这些 使用代码表示 大家应该都知道无非是列数或者行数发生变化 既然这样 那我们就开始尝试写代码 同样的 先使用正方形矩阵来写
来,我们再总结一下逻辑 (控制是往右上方还是往左下方走的需要一个变量 设置为flag 为true的时候往右上方走 为false的时候往左下方走 )
当往右上方走的时候,碰到上边界 往右走 方向改变 碰到右边界 往下走 方向改变 啥都没碰到就继续走
当往左下方走的时候,碰到下边界,往右走,方向改变 碰到左边界 往下走 方向改变 啥都没碰到就继续走
class Solution(object): def findDiagonalOrder(self, mat): flag=True n = len(mat) result=[] row=0 col=0 for i in range(n*n): result.append(mat[row][col]) if flag: if row==0: col+=1 flag=False elif col==n-1: row+=1 flag=False else: row-=1 col+=1 else: if row == n-1: col += 1 flag = False elif col == 1: row += 1 flag = False else: row += 1 col -= 1 return result mat=[[1,2,3],[4,5,6],[7,8,9]] solution=Solution() result=solution.findDiagonalOrder(mat) print(result)
这个是我写的代码 但是显示越界错误 因为我把顺序弄的不好 没有考虑到越界问题
if row==0:
col+=1#向右走
flag=False
elif col==n-1:
row+=1
flag=False 像这个 如果row==0的时候 col也到了边界怎么办 此时没办法再向右走 但是对于碰到了右边界 是绝对可以往下走的(这个大家最好画一下图)所以这两个的顺序要进行修改(当然我那个else部分的关于列的代码也写错了)
class Solution(object): def findDiagonalOrder(self, mat): flag=True n = len(mat) result=[] row=0 col=0 for i in range(n*n): result.append(mat[row][col]) if flag: if col==n-1: row+=1 flag=False elif row==0: col+=1 flag=False else: row-=1 col+=1 else: if row == n-1: col += 1 flag = True elif col == 0: row += 1 flag = True else: row += 1 col -= 1 return result mat=[[1,2,3],[4,5,6],[7,8,9]] solution=Solution() result=solution.findDiagonalOrder(mat) print(result)
这样就对了 然后再修改一下 应对与m*n的情况
class Solution(object): def findDiagonalOrder(self, mat): flag=True m=len(mat) n = len(mat[0]) result=[] row=0 col=0 for i in range(m*n): result.append(mat[row][col]) if flag: if col==n-1: row+=1 flag=False elif row==0: col+=1 flag=False else: row-=1 col+=1 else: if row == m-1: col += 1 flag = True elif col == 0: row += 1 flag = True else: row += 1 col -= 1 return result mat=[[1,2,3],[4,5,6],[7,8,9]] solution=Solution() result=solution.findDiagonalOrder(mat) print(result)
同样的很好改 我觉得我之前写的那个对角线变化 与min()的思路很不好 这个还蛮好的 而且考虑的情况也很全面 比我那个好想多了
码字不易 可以点赞收藏加关注吗?