剑指Offer-29题
题目描述:顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
**题解思路:**使用 模拟 的方法
- 定义四个边界变量表示当前要遍历的边界:上(top)、下(bottom)、左(left)、右(right),条件结束的标志是[上边界<=下边界 且 左边界<=有边界]
- 再顺时针打顺序依次遍历矩阵的每一圈,并将每一个遍历到的元素添加到列表中,并更新边界的位置,继续下一轮的遍历,遍历顺序为:
- 从左到右
- 从上到下
- 从右到左
- 从下到上
代码如下:
class Solution {
/**
* 解题思路:使用 模拟 的方法
*/
public int[] spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();
if (matrix.length == 0 || matrix[0].length == 0 || matrix == null) return list.stream().mapToInt(Integer::intValue).toArray();
//定义四个边界:上、下、右、左
int top = 0, bottom = matrix.length-1, left = 0, right = matrix[0].length-1;
while (top<=bottom && left<=right){
//从左至右遍历
for (int i=left;i<=right;i++){
list.add(matrix[top][i]);
}
top++;//最上面一行遍历结束,向下移一行
//从上到下遍历
for (int i=top;i<=bottom;i++){
list.add(matrix[i][right]);
}
right--;//最右边一列遍历结束,向左移一列
//查看是否有剩余
if (top<=bottom && left<=right){
//从右向左遍历
for (int i=right;i>=left;i--){
list.add(matrix[bottom][i]);
}
bottom--;//最下面的一行遍历结束,向上移一行
//从下到上遍历
for (int i=bottom;i>=top;i--){
list.add(matrix[i][left]);
}
left++;//最左边一列遍历结束,向右移一列
}
}
return list.stream().mapToInt(Integer::intValue).toArray();//将 list->int[]
}
}