Leetcode-D46-数组-59. 螺旋矩阵 II&73. 矩阵置零

一、复习

56、合并区间
先用sort,然后,分三种情况(不相交、相交、重叠)进行讨论和合并。
57、 插入区间
在56的基础上进行修改就ok了,先加入,再进行56的操作。
但我感觉这道题有更简单的做法,因为给的list已经有特征了——不重叠、有序,所以应该会有简单一点的操作。

59. 螺旋矩阵 II

感觉是前面某个旋转矩阵的改编,甚至更为简单,因为这里面一定是正方形——用原来的方法可以,但也可能有更简单的方法,比如说,固定循环几次(与n有关),每次往上下左右走几个格。但是还是用之前的方法吧,更智能一些(虽然复杂度可能会高一些),但是省脑子啊。
1、通过了!不过在调试的时候有一个小错误,就是数字是从1开始的,而我取得值是i,也就是从0开始的,所以其实在赋值的时候需要赋i+1.

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        size = n*n
        directions=[[0,1],[1,0],[0,-1],[-1,0]]
        dir_index=0
        col,row = 0,0
        hash = [[False]*n for _ in range(n)]
        res = [[0]*n for _ in range(n)]
        for i in range(size):
            res[row][col]=i+1
            hash[row][col]=True
            
            next_row = row+directions[dir_index][0]
            next_col = col+directions[dir_index][1]
            if next_row>=n or next_col>=n or hash[next_row][next_col]==True:
                dir_index=(dir_index+1)%4
                next_row = row+directions[dir_index][0]
                next_col = col+directions[dir_index][1]
            row = next_row
            col = next_col

        return res

73. 矩阵置零(复习)

1、常数空间,直接for循环,暴力解决不行吗?
需要区分原来的0,和新写入的0。
2、m+n空间,用hash记录就可以。但是常数空间,着实令人着急。看下答案
3、
(1)改变了以后,数据就变了,所以要进行两次。
(2)不额外开辟空间,就是用本地的空间。用第一行和第一列,但是这样会有什么问题呢?
自身的那一行的数据怎么办呢?
(3)首先遍历的时候,特别记录一下,第一行、第一列是否有0。如果有0,那么最后直接全部置0;如果没有,就直接记录就好(被记录为0的那个地方,反正最后那一行或者一列都要变为0,所以问题不大。)
4、自己实现一下。通过了,但是需要注意的是,第二遍更改的时候,需要从第2行和第2列开始,因为第一行和第一列记录着是否要更改的数据,如果连这个都改了,那么将无所凭据。
也正因为此,我们要先扫描一遍第一行和第一例,看其本身是否有0,是否需要全部置0,这样才不会被后来添加的、记录别的行列是否置0的数据干扰。
也就是说,因为我们想用第一行第一列去记录其他行列是否置零,为了不让第一行列的数据丢掉,我们要先记录他自身的数据——也就是先扫描,然后通过两个flag对其进行记录。

还有一个小问题,就是flag=1代表什么(我选的是代表有0,第一行或列需要置0),不要弄乱了哦。刚开始报错就是因为这个。

这道题O(m+n)比较容易想到,但是O(1)没想到。但感觉O(1)一般是不是就是用自身的空间,这样就不会额外占空间了呢。所以额外空间为常数。

明天复习一下叭!

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        row_flag,col_flag=0,0
        m = len(matrix)
        n= len(matrix[0])

        for i in range(m):
            if matrix[i][0]==0:
                col_flag=1
                break
        for j in range(n):
            if matrix[0][j]==0:
                row_flag=1
                break
        
        for i in range(1,m):
            for j in range(1,n):
                if matrix[i][j]==0:
                    matrix[0][j]=0
                    matrix[i][0]=0
        for i in range(1,m):
            for j in range(1,n):
                if matrix[i][0]==0 or matrix[0][j]==0:
                    matrix[i][j]=0
        
        if row_flag==1:
            for j in range(n):
                matrix[0][j]=0
        if col_flag==1:
            for i in range(m):
                matrix[i][0]=0
        return matrix


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值