矩阵学习--题目改进优化

我们来看一下针对于上一题,大佬是如何写的

大家先看这个轨迹 是如何进行运行的 就是一开始向右上方移动 如果碰壁 那就向左下角移动 如果碰壁 继续向右上角移动

那么设置一个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()的思路很不好  这个还蛮好的 而且考虑的情况也很全面 比我那个好想多了 

码字不易 可以点赞收藏加关注吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值