此题出自牛客网的剑指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.
题目分析
这道题的总体思路还是比较简单的,画一个图就一目了然了。按照顺时针的顺序依次向容器里添加元素。就是细节上的问题比较多,稍不注意,就可能出现重复添加的操作
代码如下:
Java版本:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> result = new ArrayList<Integer>();
//记录总行数跟总列数
int rows = matrix.length;
int cols = matrix[0].length;
if(rows == 0||cols == 0){
return result;
}
//记录下矩阵的四个边角点
int top = 0,bottom = rows-1;
int left = 0,right = cols-1;
while(top<=bottom&&left<=right){
//from left to right
for(int i = left;i<=right;i++){
result.add(matrix[top][i]);
}
//from top to bottom
for(int i = top+1;i<=bottom;i++){
result.add(matrix[i][right]);
}
//from right to left
for(int i = right-1;i>=left&&top<bottom;i--){
result.add(matrix[bottom][i]);
}
//from bottom to top
for(int i=bottom-1;i>top&&right>left;i--){
result.add(matrix[i][left]);
}
top++;
left++;
bottom--;
right--;
}
return result;
}
}
C++版本
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> result;
int row = matrix.size();
int col = matrix[0].size();
if(row==0||col==0)
{
return result;
}
int top = 0,bottom = row-1;
int left = 0,right = col-1;
while(top<=bottom && left<=right)
{
for(int i=left;i<=right;i++)
{
result.push_back(matrix[top][i]);
}
for(int i=top+1;i<=bottom;i++)
{
result.push_back(matrix[i][right]);
}
for(int i=right-1;i>=left&&top<bottom;i--)
{
result.push_back(matrix[bottom][i]);
}
for(int i=bottom-1;i>top&&left<right;i--)
{
result.push_back(matrix[i][left]);
}
top++;
bottom--;
left++;
right--;
}
return result;
}
};