顺时针打印矩阵

image.png

解法一:递归
第一步:
顺时针打印矩阵,一圈一圈的打印,首先想到的就是用递归的方法,每次传入一个矩阵,然后打印矩阵的外面的一圈。然后递归打印子矩阵。

当什么时候递归结束呢?

  1. 当矩阵为None的时候,即子矩阵已经没有的时候,比如下图中,1234,子矩阵为空,返回


    image.png
  2. 当矩阵为[] 时,返回
  3. 当矩阵为[[ ]]时,返回

注意子矩阵的表达方法

千万不可以 matrix[i:x][j:y]
这样表达的结果是(matrix[i:x])[j:y],前面的那个返回的是一个列表,然后相当于是列表的切片处理。

正确表达:

subMatrix = [matrix[i][1:cols-1] for i in range(1, rows-1)]

第二步:
打印出传入矩阵的外围的一圈,方向:


image.png
  1. 首先打印出第一行 全部
  2. 打印右边的竖直部分(不包含第一行和最后一行),当rows>2时,才需要打印
  3. 打印下面的水平部分,当rows >1时,需要打印
  4. 打印左面的水平部分,当cols > 1 是,需要打印,否则与2重合了

代码:

# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def __init__(self):
        self.ans = []
    def printMatrix(self, matrix):
        # write code here
        if matrix == None or len(matrix) == 0 or len(matrix[0]) == 0:
            return
        rows = len(matrix)
        cols = len(matrix[0])
        self.ans.extend(self.printFun(matrix))
        subMatrix = [matrix[i][1:cols-1] for i in range(1, rows-1)]
        self.printMatrix(subMatrix)
        return self.ans
    def printFun(self,matrix):
        rows = len(matrix)
        cols = len(matrix[0])
        l = []
        for j in range(0,cols):
            l.append(matrix[0][j])
        if rows >= 3:
            for i in range(1,rows-1):
                l.append(matrix[i][cols-1])
        if rows > 1:
            for j in range(cols-1, -1,-1):
                l.append(matrix[rows-1][j])
        if cols > 1 :
            for i in range(rows-2,0,-1):
                l.append(matrix[i][0])
        return l

解法二:循环
发现每次打印的左上角为(start, start) 当2start < rows and 2start < cols 时,循环。
一定要考虑边界和特殊情况,一行,一列,一个数等

# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        rows = len(matrix)
        cols = len(matrix[0])
        if matrix == None or rows <= 0 or cols <= 0:
            return 
        start = 0
        self.ans = []
        while cols > start*2 and rows > start *2:
            self.printFun(matrix, start)
            start += 1
        return self.ans
    def printFun(self,matrix, start):
        rows = len(matrix)
        cols = len(matrix[0])
        endCol = cols - start -1
        endRow = rows - start -1
        for j in range(start, endCol+1):
            self.ans.append(matrix[start][j])
        if start < endRow:
            for i in range(start+1, endRow): 
                self.ans.append(matrix[i][endCol])
        if start <= endCol and start < endRow:
            for j in range(endCol, start-1, -1):
                self.ans.append(matrix[endRow][j])
        if start < endCol :
            for i in range(endRow-1, start, -1):
                self.ans.append(matrix[i][start])
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容