顺时针打印矩阵(剑指offer)

顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
示例1
输入
[[1,2],[3,4]]
返回值
[1,2,4,3]

解题思路:

  1. 设置up,down,left,right四个点。
    先向走,将整行的值保存下来。该行再也不会被遍历到,则代表上界的up的值+1,该值不能超过下界down的值。
    走,将整列的值保存下来。该列再也不会被遍历到,则代表右界的right的值-1,该值不能小于左界left的值。
    走,将整行的值保存下来。该行再也不会被遍历到,则代表下界的down的值-1,该值不能小于上界up的值。
    走,将整列的值保存下来。该列再也不会被遍历到,则代表左界的left的值+1,该值不能超过右界right的值。
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        if not matrix :
            return matrix
        up = 0
        down = len(matrix) - 1
        left = 0
        right = len(matrix[0]) - 1
        result = []
        while up <= down or left<= right:
        	#先向右走,将整行的值保存下来
            for i in range(left,right+1):
                result.append(matrix[up][i])
            up += 1   #代表上界的up的值+1
            if up>down:     #该值不能超过下界down的值
                return result
            #向下走,将整列的值保存下来
            for i in range(up,down+1):
                result.append(matrix[i][right])
            right -= 1	#代表右界的right的值-1
            if right<left:	#该值不能小于左界left的值
                return result
            #向左走,将整行的值保存下来。
            for i in range(right,left-1,-1):
                result.append(matrix[down][i])
            down -= 1	#代表下界的down的值-1
            if down<up:	#该值不能小于上界up的值。
                return result
            #向上走,将整列的值保存下来
            for i in range(down,up-1,-1):
                result.append(matrix[i][left])
            left += 1	#代表左界的left的值+1
            if left>right:	#该值不能超过右界right的值
                return result
  1. 将第一行的值保存下来后,将它从矩阵中去掉,然后将矩阵从“地面”向左翻转90度。重复该操作直到矩阵为空。如:
    1, 2, 3, 4】,
    【 5, 6, 7, 8】,
    【 9,10,11,12】,
    【13,14,15,16】】
    变为:
    【【 5, 6, 7, 8】,
    【 9,10,11, 12】,
    【13,14,15, 16】】
    变为:
    【【8,12,16】,
    【7,11,15】,
    【6,10,14】,
    【5, 9,13】】
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        if not matrix:
            return matrix
        result = []
        while len(matrix) > 0:
            #extend 在列表末尾一次性追加另一个序列中的多个值
            result.extend(matrix[0])  #将第一行的值保存下来
            if len(matrix) > 1:     #去掉第一行的值后是否矩阵为空
                matrix = matrix[1::]   #去掉第一行的值
            else:
                return result
            #将矩阵逆时针翻转90度
            matrix = [[row[i] for row in matrix] for i in range(len(matrix[0])-1,-1,-1)]
上一篇:题解 P3412 【仓鼠找sugar II】


下一篇:kotlin面试题,渣本毕业两年经验,先收藏了