面试题20:顺时针打印矩阵(Leetcode-54和57)
2017-11-08 10:40
567 查看
一.打印矩阵
题目:输入一个矩阵,从外向里顺时针打印出每一个数字,例如输入以下矩阵:输出:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。
分析:可以把这个问题分解为各个小圈,每圈按照顺时针来访问。
对于5*5的矩阵而言,最后一圈只有一个数字,其坐标是(2,2),我们发现5>2*2;
对于6*6的矩阵而言,最后一圈有4个数字,其左上角坐标还是(2,2),我们发现6>2*2依然成立;
于是,我们得出循环结束的条件是:
columns>startX*2和rows>startY*2
所以我们有如下循环来打印矩阵:
void PrintMatrix(int matrix[][3], int rows, int columns) { if(matrix == NULL || rows <= 0 || columns <= 0) { return; } int start = 0; while(rows > start*2 && columns > start*2) { PrintMatrixHelper(matrix, rows, columns, start); start++; } }
注意:二维数组的传参要指定第二维数组的大小,不能直接用int来传参。**
PrintMatrixHelper函数如何实现呢?
按照顺时针方向来,有四个方向:
1. 从左往右
2. 从上往下
3. 从右往左
4. 从下往上
我们可以按照这个思路,依次遍历。
注意的第3步和第4步,需要判断这一行和这一列是否已经遍历过,即判断endX和start大小,endY和start大小。
void PrintMatrixHelper(int matrix[][3], int rows, int columns, int start) { int endX = columns - 1 - start; //从左往右打印 for(int i=start; i <= endX; ++i) { printf("%d,", matrix[start][i]); } int endY = rows - 1 - start; //从上往下打印 for(int i=start+1; i <= endY; ++i) { printf("%d,", matrix[i][endX]); } //从右往左打印,要判断所在行是否大于start,否则会重复打印 if(start < endY) { for(int i=endX-1; i >= start; --i) { printf("%d,", matrix[endY][i]); } } //从下往上打印,要判断所在列是否大于start,否则会重复打印 if(start < endX) { for(int i=endY-1; i > start; --i) { printf("%d,", matrix[i][start]); } } }
测试用例:
矩阵有多行多列,一行多列,多行一列,一行一列。主函数如下:
//int matrix[4][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16}}; //int matrix[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}}; //int matrix[1][3] = {{1,2,3}}; //int matrix[3][1] = {{1},{2},{3}}; //int matrix[3][2] = {{1,2},{3,4},{5,6}}; int matrix[1][1] = {{1}}; PrintMatrix(matrix, 1, 1);
Leetcode-54(Spiral Matrix)中传入参数是
vector<vector<int>>,返回值为
vector<int>,思路是一样的。
二. 螺旋生成N平方矩阵
思路与上面差不多,只是在helper函数里,多一个引用传递参数start_value,用于记录遍历到哪一个数了。另外
vector<vector<int>>的动态初始化也要注意。
vector<vector<int>> generateMatrix(int n) { vector<vector<int> > ret(n, vector<int>(n, 1)); if(n <= 0) { return ret; } int start = 0; int start_value = 1; while(n > start*2) { generateMatrixHelper(n, start, start_value, ret); start++; } return ret; } void generateMatrixHelper(int n, int start, int &start_value, vector<vector<int>>& matrix) { int end = n - 1 - start; //从左往右填充数据 for(int i=start; i <= end; ++i) { matrix[start][i] = start_value; start_value++; } // 4000 从上往下填充数据 for(int i=start+1; i <= end; ++i) { matrix[i][end] = start_value; start_value++; } //从右往左填充数据,要判断所在行是否大于start,否则会重复填充 if(start < end) { for(int i=end-1; i >= start; --i) { matrix[end][i] = start_value; start_value++; } } //从下往上填充数据,要判断所在列是否大于start,否则会重复填充 if(start < end) { for(int i=end-1; i > start; --i) { matrix[i][start] = start_value; start_value++; } } }
相关文章推荐
- leetcode-54 Spiral Matrix 顺时针打印矩阵(《剑指offer》面试题20)
- 剑指offer 面试题20:顺时针打印矩阵及其变形(LeetCode54. Spiral Matrix旋转矩阵) 题解
- 面试题20:顺时针打印矩阵
- [剑指offer]面试题20:顺时针打印矩阵
- 剑指Offer系列-面试题20:顺时针打印矩阵
- 【面试题20】顺时针打印矩阵
- 面试题 20: 顺时针打印矩阵
- 剑指offer-面试题20:顺时针打印矩阵
- 剑指offer之面试题20顺时针打印矩阵
- 剑指offer 面试题20 顺时针打印矩阵
- 剑指offer-面试题20-顺时针打印矩阵
- 面试题20 顺时针打印矩阵
- 面试题20:顺时针打印矩阵
- 《剑指Offer》学习笔记--面试题20:顺时针打印矩阵
- LeetCode-54. Spiral Matrix (JAVA)(顺时针打印矩阵)
- 剑指offer面试题20-顺时针打印矩阵
- 剑指offer-面试题20 顺时针打印矩阵
- 【剑指offer】面试题20:顺时针打印矩阵
- 面试题20:顺时针打印矩阵
- 《剑指offer》面试题20 顺时针打印矩阵