JZ19 顺时针打印矩阵
描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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]
示例
输入:
[[1,2],[3,4]]
返回值:
[1,2,4,3]
解析
本来吧,这种题也没什么特色,不想特意记一下。不过想了半天也没想出来,看了一眼题解恍然大悟,这种方法属实通俗易懂方便实现,所以还是记录了一下!
顺时针打印矩阵,即按照从左到右、从上到下、从右到左、从下到上的顺序一直循环,直到打印完整个数组。这就出现了两个问题:如何按照顺序打印和何时停止。
核心思想为:已经打印过的一条路线后面就不需要了。定义四个变量,up
代表数组上边界、down
代表数组下边界、left
代表数组左边界、right
代表数组右边界。于是可以通过控制边界的值调整数组的大小,随着打印的进度缩小数组,最后数组缩小为不存在时(即上边界大于下边界,或左边界大于右边界),说明输出完成(何时停止)。
打印的顺序为:首先从左到右,即 up
不变,变量 i
从 left
增加到 right
,当前的 up
边界就打印完了,将 up
加一,即上边界移动到下一行;再到从上到下,即 right
不变,变量 i
从 up
增加到 down
,当前的 right
边界就打印完了,将 right
减一,即右边界移动到左一行;剩下的从左到右、从下到上同理。
代码清单
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> result = new ArrayList<Integer>();
if(matrix == null)
return result;
// 数组上边界
int up = 0;
// 数组下边界(行)
int down = matrix.length-1;
// 数组左边界
int left = 0;
// 数组右边界(列)
int right = matrix[0].length-1;
while( true ){
for(int i=left;i<=right;i++){
result.add(matrix[up][i]);
}
up++;
if(up>down)
break;
for(int i=up;i<=down;i++){
result.add(matrix[i][right]);
}
right--;
if(left>right)
break;
for(int i=right;i>=left;i--){
result.add(matrix[down][i]);
}
down--;
if(up>down)
break;
for(int i=down;i>=up;i--){
result.add(matrix[i][left]);
}
left++;
if(left>right)
break;
}
return result;
}
}
总结
对数组的操作属实头大,不过这种控制遍历数组走向的题目还是挺多见的,还是比较有思考意义的。