对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。
给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
测试样例:
[[1,2],[3,4]],2,2
返回:[1,2,4,3]
思路:定义四个指针left,right,low,high其中left从左往右走,right从右往左走,low从上往下走,high从下往上走
需要考虑两种特殊情况:以以下两个矩阵为例
[[1,2,3],[4,5,6],[7,8,9]] 第一圈打印完之后只剩下5,而5会在第一个for循环中打印,此时low==high所以只有当low !=high时才会接着打印low的下一行
[[1,2,3],[4,5,6],[7,8,9],[10,11,12]] 第一圈打印完之后只剩下5和8,而5会在第一个for循环中打印,8会在第二个for训话中打印,此时left==right所以只有当left!=right时才会接着打印left右边的值
public class Printer {
public int[] clockwisePrint(int[][] mat, int n, int m) {
// write code here
int[] res = new int[n * m];
int x = 0;
//只有一行的情况
if (n == 1) {
for (int i = 0; i < m; i++) {
res[i] = mat[0][i];
}
return res;
}
//只有一列的情况
if (m == 1) {
for (int i = 0; i < n; i++) {
res[i] = mat[i][0];
}
return res;
}
int left = 0, right = m - 1, low = 0, high = n - 1;
while (left <= right && low <= high) {
//从左往右
for (int i = left; i <= right; i++) {
res[x++] = mat[low][i];
}
//从上往下
for (int i = low + 1; i <= high; i++) {
res[x++] = mat[i][right];
}
//排除只剩下 一行的情况【因为如果只剩一行,那么上边第一个for循环就已经打印过了】
//从右往左
if (high != low) {
for (int i = right - 1; i >= left; i--) {
res[x++] = mat[high][i];
}
}
//排除只剩下一列的情况【因为如果只剩一列,那么上边两个for循环就已经打印过了】
//从下往上
if (right != left) {
for (int i = high - 1; i >= low + 1; i--) {
res[x++] = mat[i][left];
}
}
left++;
right--;
low++;
high--;
}
return res;
}
}