例题描述
对于一个矩阵,请设计一个算法从左上角(mat[0][0])
开始,顺时针打印矩阵元素。
给定int
矩阵mat
,以及它的维数n x m
,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
示例1:
- 输入:
[[1,2],[3,4]],2,2
- 输出:
[1,2,4,3]
解题思路
- 先记录左上角和右下角坐标 (这两个坐标就描述了一个矩形)
- 然后先按照顺时针打印这个矩形边上的元素
- 缩小矩形(也就是调整左上和右下坐标位置)
- 再次顺时针打印. 一直缩小到这个矩形为空即可
代码实现一
class Printer {
public:
vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) {
vector<int> ret;
int x1 = 0, y1 = 0; //左上角坐标
int x2 = n-1, y2 = m-1; //右下角坐标
// 这两个坐标表示了一个矩形(最开始的矩阵),然后按照要求打印最外圈的数据.
while(x1 <= x2 && y1 <= y2){
for(int j = y1; j <= y2; ++j)
ret.push_back(mat[x1][j]);
for(int i = x1+1; i < x2; ++i)
ret.push_back(mat[i][y2]);
for(int j = y2; x1 < x2 && j >= y1; --j) //x1 < x2:只有在不是单一的横行时才执行这个循环
ret.push_back(mat[x2][j]);
for(int i = x2-1; y1 < y2 && i > x1; --i)//y1 < y2:只有在不是单一的竖列时才执行这个循环
ret.push_back(mat[i][y1]);
// 打印完毕之后, 缩小矩形的大小.
x1++; y1++;
x2--; y2--;
}
return ret;
}
};
代码实现二
Figure Out By JAVA
public class Printer {
public int[] clockwisePrint(int[][] mat,int n,int m) {
int[] a =new int[m*n];
if( mat == null)
return a;
int i =0;
int j =0;
int k =0;
intstartX = 0;
intstartY = 0;
intendX = n - 1;
intendY = m - 1;
while( startX <= endX && startY <= endY ){
//如果只剩下一行
if( startX == endX ){
for( ; j <= endY ;j++,k++){
a[k] = mat[startX][j];
}
return a;
}
//如果只剩下一列
if( startY == endY ){
for( ; i <= endX ; i++,k++){
a[k] = mat[i][startY];
}
return a;
}
//将矩阵上边除右顶点添加到返回的数组中
for( ; j < endY ; j++,k++){
a[k] = mat[i][j];
}
//将矩阵右边除边下顶点添加到返回的数组中
for( ; i < endX ; i++,k++){
a[k] = mat[i][j];
}
//将矩阵下边除边左顶点添加到返回的数组中
for( ; j > startX ; j--,k++){
a[k] = mat[i][j];
}
//将矩阵左边除边上顶点添加到返回的数组中
for( ; i > startY ; i--,k++){
a[k] = mat[i][j];
}
i++;
j++;
startX++;
startY++;
endX--;
endY--;
}
return a;
}
}
链接:https://www.nowcoder.com/questionTerminal/97e7a475d2a84eacb60ee545597a8407