题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
这道题和2018blibli笔试题是一个类型的(几乎是一样的):https://www.cnblogs.com/cstdio1/p/11083964.html
常规解题思路:加上一个vis数组用来判断是否遍历过此点,再加上一个大的控制结束的循环和4个方向的循环就可解题
class Solution { public: vector<int> printMatrix(vector<vector<int> >a) { int vis[100][100]={0}; int i=0,j=0; int s=0; int rows=a.size(),cols=a[0].size(); vector<int> result;//结果向量保存输出结果 while(s!=rows*cols){ while(j<cols&&vis[i][j]==0){//turn right result.push_back(a[i][j]); vis[i][j]=1; s++;j++; }j--;i++; while(i<rows&&vis[i][j]==0){//turn down result.push_back(a[i][j]); vis[i][j]=1; s++;i++; }i--;j--; while(j>=0&&vis[i][j]==0){//turn left,注意j>=0,最开始鞋厂j>0害我检查半天 result.push_back(a[i][j]); vis[i][j]=1; s++;j--; }j++;i--; while(i>=0&&vis[i][j]==0){//turn right,注意j>=0,最开始鞋厂i>0害我检查半天 result.push_back(a[i][j]); vis[i][j]=1; s++;i--; }i++;j++; }return result; } };
class Solution { public int[] spiralOrder(int[][] matrix) { if(matrix==null||matrix.length==0) return new int[0]; int m=matrix.length,n=matrix[0].length; boolean [][]flag = new boolean [m][n];//标记数组 int []res = new int[m*n];//结果数组 int cnt=0;//计数器判断是否终止 int i=0,j=0;//行和列 while(cnt<m*n){ while(j<n&&flag[i][j]==false){//right res[cnt++]=matrix[i][j]; flag[i][j]=true; j++; } j--;//碰壁之后回退一格 i++;//向下一个(因为此元素已经遍历过了) while(i<m&&flag[i][j]==false){//down res[cnt++]=matrix[i][j]; flag[i][j]=true; i++; } i--; j--; while(j>=0&&flag[i][j]==false){//left res[cnt++]=matrix[i][j]; flag[i][j]=true; j--; } j++; i--; while(i>=0&&flag[i][j]==false){//up res[cnt++]=matrix[i][j]; flag[i][j]=true; i--; } i++; j++; } return res; } }