给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
考点
1.抽象问题画图
2.复杂问题分解成简单问题
思路
1.把矩阵看成若干个顺时针方向的圈组成
1.1 每个圈的起点都是(start,start) ,横纵坐标相等
1.2 对于5*5的矩阵,最后一圈只有一个数字(2,2),5>2*2.对于6*6的矩阵,最后一圈有四个数字,左上角起点(2,2),6>2*2
1.3 横纵坐标都小于行列数的1/2,才能作为起点。下标从0开始,所以是小于,不是小于等于
循环条件 while ( cols > start << 1 && rows > start<<1)
2.打印矩阵最里面的一圈,可能只需要三步、两步、甚至一步
2.1 定义起点横纵坐标的终止位置
终止列号:EndX = cols - 1 - start;
终止行号:EndY = rows - 1 - start;
数学意义:
边界坐标 = 最后一列坐标 - 已经打印过的列数=(cols-1)-(start-0)= cols - 1 - start;
2.2 从左到右打印第一行
第一步总是需要的,
循环条件:i=start;i<=EndX;i++
print num[start][i]
2.3 从上到下打印最后一列:
第二步条件:至少两列, start<EndY
循环条件:i=start+1;i<=endY;i++
print num[i][EndX];
2.4 从右到左打印最后一行
第三步条件:至少两行两列 start<EndX && start < EndY
循环条件: i=EndX-1;i>=start;i--