《剑指offer》顺时针打印矩阵
本题来自《剑指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.
思路:
思考两个问题,分两步走:
第一步:总结,一个矩阵总共要走几圈?条件是行和列要大于圈数的2倍。
第二步:每一圈该怎么遍历?外圈是先第一行,最后一列,最后一行,第一列的方式进行遍历。
C++ Code:
class Solution { public: vector<int> printMatrix(vector<vector<int> > matrix) { //加入输入为空,处理 int start = 0; //一个矩阵跑的圈数 int row = matrix.size(); //矩阵行数 int col = matrix[0].size(); //矩阵列数 vector<int> result; //存放结果值 while (row>start*2 && col>start*2){ //循环圈数 result = dealData(matrix,start,result); //每一圈的处理代码 start++; } return result; } vector<int> dealData(vector<vector<int>> matrix,int start,vector<int> result){ int endX = matrix[0].size()-start -1; //X轴为横坐标,即为矩阵的列数 int endY = matrix.size()-start-1; //Y轴为竖坐标,即为矩阵的行数 for (int i=start;i<=endX;i++){ //处理第一行,从左往右,从[start,endX] result.push_back(matrix[start][i]); } if (endY>start){ //前提是处理的start没有越过最后一行 for (int i=start+1;i<=endY;i++){ //处理最后一列,从上到下,从[start+1,endY] result.push_back(matrix[i][endX]); } } if (start<endX && start<endY){ //前提是start没有越界(行和列) for (int i=endX-1;i>=start;i--){ //处理最后一行,从右往左,[endX,start]递减 result.push_back(matrix[endY][i]); } } if (start<endX && start<endY-1){ //边界条件是start依然小于行列两个边界 for (int i=endY-1;i>=start+1;i--){ //处理第一列,从下往上,[endY-1,start+1]递减 result.push_back(matrix[i][start]); } } return result; //将得到的值返回 } };
Python Code:
# -*- coding:utf-8 -*- class Solution: # matrix类型为二维列表,需要返回列表 def printMatrix(self, matrix): # write code here if not matrix: #边界,输入为空要处理 return None row = len(matrix) #行 col = len(matrix[0]) #列 start = 0 #圈数 result = [] #结果存放容器 while row>start*2 and col>start*2: #圈数的循环条件,行和列要大于行列的2倍 resut = self.dealData(matrix,start,result)#调用处理每一圈 start += 1 #圈数递增 return result def dealData(self,matrix,start,result): endX = len(matrix[0])-start-1 #X坐标,最后一列 endY = len(matrix)-start-1 #Y坐标,最后一行 for i in range(start,endX+1): #处理第一行 result.append(matrix[start][i]) if (start<endY): for i in range(start+1,endY+1): #处理最后一列 result.append(matrix[i][endX]) if start<endX and start<endY: for i in range(endX-1,start-1,-1): #处理最后一行 result.append(matrix[endY][i]) if start<endX and start<endY-1: for i in range(endY-1,start,-1): #处理第一列 result.append(matrix[i][start]) return result